Spark SQL:Parquet資料來源之自動分割槽推斷

豐澤發表於2018-09-26

自動分割槽推斷(一)

表分割槽是一種常見的優化方式,比如Hive中就提供了表分割槽的特性。在一個分割槽表中,不同分割槽的資料通常儲存在不同的目錄中,分割槽列的值通常就包含在了分割槽目錄的目錄名中。Spark SQL中的Parquet資料來源,支援自動根據目錄名推斷出分割槽資訊。例如,如果將人口資料儲存在分割槽表中,並且使用性別和國家作為分割槽列。那麼目錄結構可能如下所示:

tableName
  |- gender=male
    |- country=US
      ...
      ...
      ...
    |- country=CN
      ...
  |- gender=female
    |- country=US
      ...
    |- country=CH
      ... 
      
複製程式碼

自動分割槽推斷(二)

如果將/tableName傳入SQLContext.read.parquet()或者SQLContext.read.load()方法,那麼Spark SQL就會自動根據目錄結構,推斷出分割槽資訊,是gender和country。即使資料檔案中只包含了兩列值,name和age,但是Spark SQL返回的DataFrame,呼叫printSchema()方法時,會列印出四個列的值:name,age,country,gender。這就是自動分割槽推斷的功能。

此外,分割槽列的資料型別,也是自動被推斷出來的。目前,Spark SQL僅支援自動推斷出數字型別和字串型別。有時,使用者也許不希望Spark SQL自動推斷分割槽列的資料型別。此時只要設定一個配置即可, spark.sql.sources.partitionColumnTypeInference.enabled,預設為true,即自動推斷分割槽列的型別,設定為false,即不會自動推斷型別。禁止自動推斷分割槽列的型別時,所有分割槽列的型別,就統一預設都是String。

程式碼:

package com.etc;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;

/**
 * @author: fengze
 * @description:
 * Parquet資料來源之自動推斷分割槽
 * 有時我們可能並不想spark sql對資料進行自動分割槽,
 * 那麼我們可以通過spark.sql.sources.partitionColumnTypeInference.enabled進行設定
 * 預設情況下它的值為true;
 */
public class ParquetPartitionDiscovery {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setAppName("ParquetPartitionDiscovery")
                .setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        SQLContext sqlContext = new SQLContext(sc);
        DataFrame json = sqlContext.read().json("D:\\Documents\\Tencent Files\\1433214538\\FileRecv\\第一階段程式碼\\第76講-Spark SQL:資料來源之通用的load和save操作\\文件\\people.json");

        json.printSchema();
        json.show();
        //root
        // |-- age: long (nullable = true)
        // |-- name: string (nullable = true)
    }
}

複製程式碼

相關文章