一、Parquet是面向分析型業務的列式儲存格式,由Twitter和Cloudera合作開發,2015年5月從Apache的孵化器裡畢業成為Apache頂級專案,最新的版本是1.8.0。
二、列式儲存和行式儲存相比有哪些優勢呢?
1、可以跳過不符合條件的資料,只讀取需要的資料,降低IO資料量。
2、壓縮編碼可以降低磁碟儲存空間。由於同一列的資料型別是一樣的,可以使用更高效的壓縮編碼(例如Run Length Encoding和Delta Encoding)進一步節約儲存空間。
3、只讀取需要的列,支援向量運算,能夠獲取更好的掃描效能
package com.etc;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;
import java.util.List;
/**
* @author: fengze
* @description:
* Parquet資料來源之使用程式設計方式載入資料
*/
public class ParquetLoadData {
public static void main(String[] args) {
SparkConf conf = new SparkConf()
.setAppName("ParquetLoadData")
.setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
// 讀取Parquet檔案中的資料,建立一個DataFrame
DataFrame userDf = sqlContext.read().parquet("D:\\文件\\users.parquet");
//將DataFrame註冊為臨時表,然後使用SQL查詢需要的資料
userDf.registerTempTable("user");
DataFrame sql = sqlContext.sql("select * from user");
// 對查詢出來的DataFrame進行transformation操作,處理資料,然後列印出來
JavaRDD<String> map1 = sql.javaRDD().map(new Function<Row, String>() {
@Override
public String call(Row row) throws Exception {
return "Name:" + row.getString(0);
}
});
List<String> collect = map1.collect();
for (String username : collect) {
System.out.println(username);
}
}
}
複製程式碼
重點:
- sqlContext.read().parquet(path)
- List map = sql.javaRDD().map(new Fuction).collect();取到該 行 的第一位數值,最後將List陣列遍歷得結果。