缺少 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,同分区overwrite,不同分区insert