我正在使用Azure数据工厂中的自集成集成运行时将数据从本地源(普通文件系统)复制到Azure Blob存储目标。传输后,我想通过附加在Databricks群集上运行的Notebook来自动处理文件。管道工作正常,但我的问题与“复制活动”的输出有关。
是否可以获取每次运行的已传输文件和文件夹的信息?我会将这些信息作为参数传递给笔记本。
查看文档,似乎只有汇总信息可用:
https://docs.microsoft.com/en-us/azure/data-factory/copy-activity-overview
如果您传输大量文件,这是有道理的。如果不可能的话,我想一种替代方法是将复制过程留给自己,然后根据存储帐户事件创建另一个管道?还是将每次运行的新文件和文件夹信息存储在固定的文本文件中,还进行传输并在笔记本中阅读?
答案 0 :(得分:0)
如果要从数据工厂读取文件或目录的信息,可以使用“获取元数据”活动来完成,请参见以下answer作为示例。
检测笔记本中新文件的另一种方法是对文件源使用结构化流。这工作得很好,您只需在复制活动之后调用笔记本活动即可。
为此,您定义了流输入数据帧:
streamingInputDF = (
spark
.readStream
.schema(pqtSchema)
.parquet(inputPath)
)
,其中 inputPath 指向Blob存储中的输入目录。支持的文件格式为text,csv,json,orc,parquet,因此是否适合您取决于具体情况。
重要的是,在目标上使用一次触发选项,因此笔记本不需要永久运行,例如。 g。:
streamingOutputDF \
.repartition(1) \
.writeStream \
.format("parquet") \
.partitionBy('Id') \
.option("checkpointLocation", adlpath + "spark/checkpointlocation/data/trusted/sensorreadingsdelta") \
.option("path", targetPath + "delta") \
.trigger(once=True) \
.start()
另一种方法可能是使用Azure队列存储(AQS),请参阅以下documentation。
答案 1 :(得分:0)
在这种情况下,解决方案实际上非常简单。我刚刚在Azure数据工厂中创建了另一个管道,该管道由 Blob Created 事件触发,并将文件夹和文件名作为参数传递给了我笔记本。似乎工作良好,并且所需的配置或代码量最少。基本过滤可以通过事件进行,其余的取决于笔记本。
对于在此情况下遇到困难的其他人,请参见以下详细信息:
https://docs.microsoft.com/en-us/azure/data-factory/how-to-create-event-trigger