数据仓库-parquet分区取代hive分区

最近升级组件发现了一些问题记录一下,spark升级到2.3.0 ,hadoop升级到3.1.0。 之前一直使用hive的外部分区表来管理数据,但是升级后发现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 文件

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字段,可解决问题。