缺少配置单元分区时,Spark SQL失败

时间:2018-09-11 10:24:06

标签: apache-spark hive pyspark pyspark-sql

我有一张桌子,桌子上有一些丢失的部分。当我在蜂巢上调用它时,效果很好

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以便摆脱这些。恐怕将来还会丢失更多分区,因此不可能采用硬编码解决方案

2 个答案:

答案 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相比,加载数据似乎花费了更多时间。