Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0。
列式存储和行式存储相比的优势:
1、 可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。
2、 压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Encoding)进一步节约存储空间。
3、 只读取需要的列,支持向量运算,能够获取更好的扫描性能。
基于java
package cn.spark.study.sql;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
/**
* parquet数据源之使用编程方式加载数据
*/
public class ParquetLoadData_6 {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("ParquetLoadData_6");
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
//第一步:读取parquet文件中的数据,创建一个DataFrame
DataFrame userDF = sqlContext.read().parquet("E:\\sparktext\\users.parquet");
userDF.registerTempTable("user");
sqlContext.sql("select * from user").show();
}
}
基于scala
package cn.spark.study.sql
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{DataFrame, SQLContext}
object ParquetLoadDate_6 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
.setMaster("local")
.setAppName("ParquetLoadData_6")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val userDF: DataFrame = sqlContext.read.parquet("E:\\sparktext\\users.parquet")
//Name:Alyssa
//Name:Ben
val name: DataFrame = userDF.select("name")
name.rdd.map(row => {
"Nmae:" + row.getString(0)
}).foreach(println)
}
}