我有一张桌子,桌子上有一些丢失的部分。当我在蜂巢上调用它时,效果很好
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以便摆脱这些。恐怕将来还会丢失更多分区,因此不可能采用硬编码解决方案
答案 0 :(得分:0)
从HDFS删除分区数据时,即不使用 Hive命令删除分区,就会发生此错误。
如果直接从 HDFS删除数据 Hive 不知道删除的分区,当我们查询hive表时,它仍然会查找目录,而目录不会HDFS中不存在它会导致file not found exception
。
要解决此问题,我们还需要使用以下方法删除与Hive表中的目录关联的分区:
alter table <db_name>.<table_name> drop partition(<partition_col_name>=<partition_value>);
然后,配置单元从元数据中删除分区,这是如果我们从HDFS中删除分区目录,则是从配置单元表中删除元数据的唯一方法。
msck修复表 doesn't drop the partitions
相反,如果新分区已添加到HDFS中,则仅添加 新分区。
correct way
,以避免将来出现此类问题,使用Hive drop partition命令来删除分区。
答案 1 :(得分:0)
相反,.config("spark.sql.hive.verifyPartitionPath", "true")
是否为您工作?我刚刚设法使用此设置使用spark-sql加载数据,而Hive的分区路径之一为空,并且分区仍存在于Hive Metastore中。尽管有一些注意事项-与将此设置设置为false相比,加载数据似乎花费了更多时间。