繁体   English   中英

如何在不取消 Azure 数据块中的 basePath 选项的“spark 分区读取”的情况下使用“recursiveFileLookup=true”?

[英]how to use "recursiveFileLookup=true" without cancelling the "spark partition reading" benefit from the basePath option in Azure databricks?

我们正在尝试制作一个通用的摄取框架。 我们希望能够读取系统中的不同文件夹。

我们注意到系统中有两种分区文件夹:

  • 火花分区: mnt/sales/ingestdate=20220102/
  • 多深度分区: mnt/sales/2022/05/07/

使用 basePath:我们使用模式.option("basePath", '/mnt/sales/').load('mnt/sales/ingestdate=20220102/')这里的 basePath 选项允许使用分区内特定文件的架构同时允许分区列在数据集中仍然可用 我们这样做是因为我们希望能够检查新收到的 csv 是否有错误的架构,仅适用于今天的分区。

我们的问题是有时我们想加载mnt/sales/2022/05/而不是例如。 mnt/sales/2022/05/07.

==> 由于 spark 不读取子级文件夹,我们得到了错误。

'无法推断 csv 的架构'

为了解决这个问题,我们正在读取文件列表而不是路径,这使得该方法无法用于增量表

我们还看到,这可以通过使用.option("recursiveFileLookup","true")来解决,但这会取消basePath选项的效果。

有没有一种方法可以同时使用 recursiveFileLookup 并从 basePath 选项中受益?

  • 该要求可以在没有使用通配符文件路径的recursiveFileLookup的帮助下实现。
  • 通配符文件路径成功解决了您面临的问题,即同时读取mnt/sales/ingestdate=20220102/mnt/sales/2022/05/ (而不是您提到的 'mnt/sales/2022/05/07' )。
  • 一个问题是当某个目录是 delta 文件夹时,因为它不接受通配符。 因此,请检查您要读取的目录是否为Delta 表 如果目录路径不是增量表,则可以使用通配符与路径,否则可以直接读取增量。
  • 以下是相同的演示,其中我采用了不同的路径并尝试仅使用basePath选项读取它们。
from delta import * 
from delta.tables import DeltaTable 

#my paths
paths = ['/mnt/sales/ingestdate=20220102/','/mnt/sales/ingestdate=20220103/','/mnt/sales/2022/05/']

for path in paths:
    if(DeltaTable.isDeltaTable(spark, path)):
        print("delta table")
        mydf =spark.read.option("header",True).option("basePath","/mnt/sales/").format("delta").load(path)
    else:
        print("not a delta table:")
        path = path+'*'   #since the directory is not delta file folder, add a wildcard path.
        mydf = spark.read.option("header",True).option("basePath","/mnt/sales/").format("csv").load(path)
    mydf.show()

在此处输入图像描述

  • 上面的代码无需recursiveFileLookup即可解决您的要求。

笔记:

  • 如果07是路径mnt/sales/2022/05/07中的增量文件夹,而您只想读取mnt/sales/2022/05 ,则不可能。 您必须指定准确的 delta 文件夹路径才能读取 delta。

  • 将通配符添加到 delta 文件夹(或)delta 文件夹的父文件夹会引发错误,因此我们使用可用路径上的条件来检查它是否是 delta。 以下是相同的参考图像。

在此处输入图像描述

这样,您可以只使用basePath选项从 delta 或/mnt/sales/ingestdate=20220102/之类的路径或/mnt/sales/2022/05/之类的路径(而不是 '/mnt/sales/2022/05 /07')。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM