spark 列出叶文件失败,文件不存在

spark Listing leaf files fails with File does not exist

在最近升级到 HDP 之后 3.1 现在使用 spark 2.3.x 而不是 2.2.x 查询如下:

spark.sql("SELECT * from mydb.mytable").filter('partition_date between "202001010000" and "202001020000").write.parquet("foo.out")

从 HDFS 支持的配置单元 table(无对象存储)读取时有时会失败。 您必须知道底层数据(Hive 中的 EXTERNAL table)有一个数据保留期,任何早于该日期的数据都将被删除。有时,这种删除可能发生在上述查询的执行过程中。删除每 5 分钟发生一次。

即使:

PartitionFilters: [isnotnull(partition_date#3099), (partition_date#3099 >= 202001010000), (partition_date#3099 <= 202001020000)]

分区过滤(谓词下推)似乎比初始路径遍历期间读取的所需分区更多。 升级到 2.3 后,Spark 在 UI 中显示列出文件目录的进度。有趣的是,我们总是得到两个条目。一个用于最旧的可用目录,一个用于感兴趣的两个边界中较低的一个:

Listing leaf files and directories for 380 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date==202001010000/sub_part=0, ...

Listing leaf files and directories for 7100 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date=201912301300/sub_part=0, ...

通知:

如何强制 Spark 仅列出所需时间间隔内的目录,而不是在外部列出并可能与最大数据保留持续时间冲突?

看起来这是相关的:

您尝试过 this 吗?

spark.sql("MSCK REPAIR TABLE table_name")

它多次救了我的命。

编辑。

在评论中讨论后,请尝试创建视图。除非在删除分区后立即重新运行 "select * from ..."才能解决问题。

创建视图将为您提供这样的解决方法:

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT * FROM mytable;

来自 Hive/LanguageManual+DDL

然后用您的观点替换 table。如果您无权创建此类视图,请让管理员为您创建。他们应该满足这个要求,因为在我看来你正在努力解决他们的问题。

@meniluca 是正确的,因为它必须与 HDFS 可用的不匹配,并且 Hive metastore 报告应该可用。

但是,与其使用看起来有点 spooky/not 易于理解的视图(在读取操作中包含文件路径的上下文中),我更喜欢:

spark.read.option("basePath", "/path/to/mydb.db/mytable").orc("/path/to/mydb.db/mytable/partition_date=202001[1-2]*/*", "/path/to/mydb.db/mytable/partition_date=202001[3-4]*/*")

这会强制 spark 列出正确的(所需路径)