从多个文件夹中读取 Delta 表

Posted

技术标签:

【中文标题】从多个文件夹中读取 Delta 表【英文标题】:Read Delta table from multiple folders 【发布时间】:2021-01-13 23:30:27 【问题描述】:

我正在开发 Databricks。我正在像这样读取我的增量表:

path = "/root/data/foo/year=2021/"
df = spark.read.format("delta").load(path)

但是在year=2021 文件夹中,每天都有子文件夹day=01day=02day=03 等...

例如,我如何读取第 4、5、6 天的文件夹?

编辑#1

我正在阅读不同问题的答案,似乎实现此目的的正确方法是使用应用了分区列的过滤器

edit2

在这里尝试下面的一些答案是我遇到的消息错误(我一开始没有看到):

Databricks Delta does not support multiple input paths in the load() API.
paths: [example_path/year=2021/month=01/day=04/,...]. To build a single DataFrame by loading
multiple paths from the same Delta table, please load the root path of
the Delta table with the corresponding partition filters. If the multiple paths
are from different Delta tables, please use Dataset's union()/unionByName() APIs
to combine the DataFrames generated by separate load() API calls.;

【问题讨论】:

【参考方案1】:

似乎读取分区增量表的更好方法是在分区上应用过滤器:

df = spark.read.format("delta").load('/whatever/path')
df2 = df.filter("year = '2021' and month = '01' and day in ('04','05','06')")

【讨论】:

它不起作用...正则表达式不被解释为正则表达式,而是一个简单的字符串... 我有以下错误`AnalysisException: example_path/year=2021/month=01/day=0[4-6] 不存在;` 我正在读取一个增量表,它可能有所不同。是的,我已经检查了路径 让我们continue this discussion in chat。【参考方案2】:

将它们列为逗号分隔值,括在大括号中

path = "/root/data/foo/year=2021/04,05,06/"

path = "/root/data/foo/year=2021/[04,05,06]/"
path = "/root/data/foo/year=2021/0[4|5|6]/"

【讨论】:

【参考方案3】:

    删除 .format("delta")。从您的源代码路径

    在UDF下面使用

    def 文件存在(文件路径,FromDay,ToDay): mylist = dbutils.fs.ls(文件路径) maxcount = len(mylist) - 今天 + 1 maxcount1 = maxcount - FromDay 为 mylist 中的项目返回 [item[0]][maxcount1:maxcount]

    filepath = 父文件路径 = "/root/data/foo/year=2021/" FromDay = 开始日文件夹 ToDay = 结束日文件夹

注意:根据您的要求更改功能。

【讨论】:

以上是关于从多个文件夹中读取 Delta 表的主要内容,如果未能解决你的问题,请参考以下文章

Spark 从另一个表更新 Delta 中的多个列

当源表的一行中的多个列与目标表中单行的相同列匹配时,从目标 spark delta 表中删除一行

databricks delta 格式文件无法读取

Databricks 正在“更新 Delta 表的状态”

如何使用 python 从文件夹中的多个 excel 文件中读取工作表名称包含“我的”的任何工作表?我正在使用 xlrd

Spark Job 卡住了将数据帧写入分区 Delta 表