資料來源Parquet之使用程式設計方式載入資料

豐澤發表於2018-09-26

一、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陣列遍歷得結果。

相關文章