數據倉庫-parquet分區取代hive分區

最近升級組件發現了一些問題記錄一下,spark升級到2.3.0 ,hadoop升級到3.1.0。 之前一直使用hive的外部分區表來管理數據,但是升級後發現Hive已經無法使用。

如圖:

數據倉庫-parquet分區取代hive分區

數據倉庫-parquet分區取代hive分區

問題在於: spark 只支持Hive 1.2.1 ,然而Hive 1.2.1卻不支持Hadoop3.0.1,比較蛋痛了。於是捨棄hive 使用parquet分區,內容如下文。

Parquet Files

1.分區發現

使用下面的目錄劃分,可以自動識別字段:

path└── to └── table ├── gender=male │ ├── ... │ │ │ ├── country=US │ │ └── data.parquet │ ├── country=CN │ │ └── data.parquet │ └── ... └── gender=female ├── ... │ ├── country=US │ └── data.parquet ├── country=CN │ └── data.parquet

使用SparkSession.read.parquet 或 SparkSession.read.load讀取path/to/table目錄。spark抽取到分區信息。

root|-- name: string (nullable = true)|-- age: long (nullable = true)|-- gender: string (nullable = true)|-- country: string (nullable = true)

使用spark.sql.sources.partitionColumnTypeInference.enabled(默認為true) 關閉列的字段類型推斷。

2.分區測試:

目錄結構:

data/parquet/partition/age=10/parquet 文件

數據倉庫-parquet分區取代hive分區

def main(args: Array[String]) { System.setProperty("hadoop.home.dir","C://hadoop" ) Logger.getLogger("org.apache.spark").setLevel(Level.ERROR); Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.ERROR); val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local") val sc = new SparkContext(conf) implicit val sqlContext = new SQLContext(sc) import sqlContext.implicits._ sc.setLogLevel("ERROR") val df = sqlContext.read.parquet(s"data/parquet/partiton") df.printSchema()輸出

root

|-- t1: string (nullable = true)

|-- t2: string (nullable = true)

|-- age: integer (nullable = true)

輸出age字段,可解決問題。


分享到:


相關文章: