如何在 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))
我正在寻找解决方法。有时我们的自动化框架会读取不存在的增量分区。它将失败,因为此分区中没有镶木地板文件。
我不想让它失败。
然后我做的是:
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))