数据源Parquet之使用编程方式加载数据
Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目
列式存储和行式存储相比有哪些优势呢?
- 可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。
- 压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Encoding)进一步节约存储空间。
- 只读取需要的列,支持向量运算,能够获取更好的扫描性能。
这里讲解Parquet数据源的第一个知识点,使用编程的方式加载Parquet文件中的数据。
案例:查询用户数据中的用户姓名。
Java版本
public class ParquetLoadData {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("ParquetLoadDataJava").setMaster("local");
SparkContext sparkContext = new SparkContext(conf);
SQLContext sqlContext = new SQLContext(sparkContext);
// 读取Parquet文件中的数据,创建一个DataFrame
DataFrame df = sqlContext.read().parquet("E:\\testdata\\sparksql\\users.parquet");
df.show();
// 将DataFrame注册为临时表,然后使用SQL查询需要的数据
df.registerTempTable("users");
// 对查询出来的DataFrame进行transformation操作,处理数据,然后打印出来
DataFrame nameDF = sqlContext.sql("select name from users");
Row[] names = nameDF.collect();
for(Row name : names) {
System.out.println("name:" + name.getString(0));
}
}
}
Scala版本
object ParquetLoadData {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("ParquetLoadDataScala")
val sparkContext = new SparkContext(conf)
val sqlContext = new SQLContext(sparkContext)
val df = sqlContext.read.parquet("E:\\testdata\\sparksql\\users.parquet")
df.registerTempTable("users")
val nameDF = sqlContext.sql("select name from users")
val rows = nameDF.collect()
for(row <- rows) {
println("name:" + row.getAs("name"))
}
}
}