自動分割槽推斷(一)
表分割槽是一種常見的優化方式,比如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)
}
}
複製程式碼