缺少 hive 分区时 Spark SQL 失败

Posted

技术标签:

【中文标题】缺少 hive 分区时 Spark SQL 失败【英文标题】:Spark SQL Fails when hive partition is missing 【发布时间】:2018-09-11 10:24:05 【问题描述】:

我有一张桌子缺少一些部分。当我在 hive 上调用它时,它工作正常

SELECT *
  FROM my_table

但是当从 pyspark (v. 2.3.0) 调用它时,它会失败并显示消息 Input path does not exist: hdfs://path/to/partition。我正在运行的 spark 代码很天真:

spark = ( SparkSession
         .builder
         .appName("prueba1")
         .master("yarn")
         .config("spark.sql.hive.verifyPartitionPath", "false")
         .enableHiveSupport()
         .getOrCreate())

spark.table('some_schema.my_table').show(10)

已提议的config("spark.sql.hive.verifyPartitionPath", "false") 是 this 问题,但对我来说似乎不能正常工作

有什么方法可以配置 SparkSession,这样我就可以摆脱这些。恐怕以后会漏掉更多的分区,所以硬编码的解决方案是不可能的

【问题讨论】:

您的表是外部的吗?如果是这样,您可以尝试通过 hive 对 hive 表进行 msck 修复或更改表添加分区 【参考方案1】:

从 HDFS 删除分区数据时会发生此错误,即未使用 Hive 命令 删除分区。

如果数据直接从HDFS中删除 Hive 不知道删除的分区,当我们查询hive表时,它仍然会查找目录,而目录不会'不存在于 HDFS 中,结果为 file not found exception

要解决此问题,我们还需要使用删除与 Hive 表中目录关联的分区

alter table <db_name>.<table_name> drop partition(<partition_col_name>=<partition_value>);

然后 hive 从元数据中删除分区,如果我们从 HDFS 中删除分区目录,这是从 hive 表中删除元数据的唯一方法。

msck repair table doesn't drop the partitions 而不是仅添加新分区如果新分区已添加到 HDFS。

correct way 可避免将来出现此类问题使用 Hive drop partition 命令删除分区。

【讨论】:

好的,但关键是我不是 Hive 的所有者,我无权创建 |下降 |改变 |等等......任何桌子。只是查询。我可以与他们交谈并要求清理分区并尝试防止将来出现此类问题,但我想没有人会听到我的请求,因此我正在尝试从 Spark 中寻找比从 hive 更好的解决方案。无论如何,谢谢你的回答;) @LuisMorillo 加载数据的另一种选择是从 HDFS 不使用 Hive 表来获取分区的数据。有关更多详细信息,请参阅此链接spark.apache.org/docs/latest/api/python/… @Shu,我们暂时无法控制 hive 表。是否有任何解决方法,以便 spark 可以优雅地处理此问题而不是抛出异常?【参考方案2】:

反过来,.config("spark.sql.hive.verifyPartitionPath", "true") 对你有用吗?我刚刚设法使用带有此设置的 spark-sql 加载数据,而 Hive 的分区路径之一是空的,并且分区仍然存在于 Hive 元存储中。尽管有一些警告 - 与此设置设置为 false 相比,加载数据似乎需要更多时间。

【讨论】:

以上是关于缺少 hive 分区时 Spark SQL 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark SQL 识别 hive 表中的分区列

Spark SQL写入Hive,同分区overwrite,不同分区insert

Spark读取HDFS数据分区参考

Spark SQL优化之路——Hive篇

Spark-sql读取hive分区表限制分区过滤条件及限制分区数量

Spark SQL分区感知查询hive表