
[英]How to query data from Azure Databricks Spark cluster without notebooks?
[英]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' )。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.