如何在 Azure Databricks 中读取空增量分区而不会失败?

How to read empty delta partitions without failing in Azure Databricks?

我正在寻找解决方法。有时我们的自动化框架会读取不存在的增量分区。它将失败,因为此分区中没有镶木地板文件。

我不想让它失败。

然后我做的是:

spark_read.format('delta').option("basePath",location) \
  .load('/mnt/water/green/date=20221209/object=34')

相反,我希望它 return 空数据框。 Return 没有记录的数据框。

我这样做了,但是觉得有点麻烦,想知道有没有更好的方法。

df = spark_read.format('delta').load(location)
folder_partition = /date=20221209/object=34'.split("/")
for folder_pruning_token in folder_partition :
  folder_pruning_token_split = folder_pruning_token.split("=")
  column_name = folder_pruning_token_split[0]
  column_value = folder_pruning_token_split[1]
  df = df .filter(df [column_name] == column_value) 

您真的不需要对 Delta Lake 表做那种把戏。这个技巧主要用于 Parquet 和其他文件格式,以避免扫描非常昂贵的 HDFS 或云存储上的文件。

您只需要加载数据,并使用 where/filter 过滤数据。这与您所做的类似:

df = spark_read.format('delta').load(location) \
  .filter("date = '20221209' and object = 34")

如果你需要,你当然可以自动提取这些值,也许代码稍微简单一点:

df = spark_read.format('delta').load(location)
folder_partition = '/date=20221209/object=34'.split("/")
cols = [f"{s[0]} = '{s[1]}'"
  for s in [f.split('=')for f in folder_partition]
]
df = df.filter(" and ".join(cols))