最近升级组件发现了一些问题记录一下,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字段,可解决问题。