Spark 不使用 Hive 分区外部表中的分区信息

Posted

技术标签:

【中文标题】Spark 不使用 Hive 分区外部表中的分区信息【英文标题】:Spark not using partition information from Hive partitioned external table 【发布时间】:2020-01-21 07:23:05 【问题描述】:

我有一个复杂/嵌套的 Hive-External 表,它是在 HDFS 之上创建的(文件为 avro 格式)。当我运行 hive 查询时,它会显示所有记录和分区。

但是当我在 Spark 中使用同一张表时:

val df =  spark
.read
.format("avro")
.load("avro_files")
.option("avroSchema", Schema.toString)

它不显示分区列。

但是,当我使用spark.sql("select * from hive_External_Table") 时,它很好,我可以看到它 在创建的数据框中,但问题是我无法手动传递提供的架构。

请注意,当我查看数据时,分区列不是底层保存数据的一部分,但是当我通过 Hive 查询表时可以看到它。我在尝试加载时也可以看到分区列使用 pyspark 的 avro 文件:

df = ( sqlContext.read.format("com.databricks.spark.avro").option("avroSchema", pegIndivSchema).load('avro_files'))

所以我想知道它是什么样的?

【问题讨论】:

【参考方案1】:

请检查您在选项架构部分中使用的Schema.toString 值中存在的列。它将缺少分区列。 还可以尝试使用您在 pyspark 代码中使用的相同架构。

option("avroSchema", pegIndivSchema)

【讨论】:

以上是关于Spark 不使用 Hive 分区外部表中的分区信息的主要内容,如果未能解决你的问题,请参考以下文章

从 hive 外部表中的分区中删除列

无法查看 hive 分区表中的数据

Hive 不读取 Spark 生成的分区 parquet 文件

使用 spark hivecontext 读取外部 hive 分区表的问题

将 Spark 数据帧保存为 Hive 中的动态分区表

Spark 结构化流写入流到 Hive ORC 分区外部表