Azure数据工厂:从复制活动输出复制的文件和文件夹信息

Azure数据工厂:从复制活动输出复制的文件和文件夹信息,azure,copy,azure-data-factory-2,Azure,Copy,Azure Data Factory 2,我正在Azure Data Factory中使用自托管集成运行时将数据从本地源(普通文件系统)复制到Azure Blob存储目标。在传输之后,我想通过附加一个运行在Databricks集群上的笔记本来自动处理这些文件。管道工作正常,但我的问题涉及复制活动的输出 是否有办法获取每次运行所传输文件和文件夹的信息?我会将这些信息作为参数传递到笔记本电脑 查看文档,似乎只有聚合信息可用: 如果你传输了大量的文件,这是有意义的。如果不可能,我想另一种方法是将复制过程留给自己,然后根据存储帐户事件创建另一

我正在Azure Data Factory中使用自托管集成运行时将数据从本地源(普通文件系统)复制到Azure Blob存储目标。在传输之后,我想通过附加一个运行在Databricks集群上的笔记本来自动处理这些文件。管道工作正常,但我的问题涉及复制活动的输出

是否有办法获取每次运行所传输文件和文件夹的信息?我会将这些信息作为参数传递到笔记本电脑

查看文档,似乎只有聚合信息可用:


如果你传输了大量的文件,这是有意义的。如果不可能,我想另一种方法是将复制过程留给自己,然后根据存储帐户事件创建另一个管道?或者将每次运行的新文件和文件夹信息存储在一个固定的文本文件中,同时传输,并在笔记本中读取?

如果您想获取从data factory读取的文件或目录的信息,可以使用“获取元数据”活动完成此操作,请参见以下示例

检测笔记本中的新文件的另一种方法是使用文件源的结构化流。这非常有效,您只需在“复制”活动之后调用“笔记本”活动

为此,您可以定义流式输入数据帧:

streamingInputDF = (
   spark
     .readStream                     
     .schema(pqtSchema)               
     .parquet(inputPath) 
 )
inputPath指向Blob存储中的输入目录。支持的文件格式为文本、csv、json、orc、拼花地板,因此这取决于您的具体场景

重要的是,在目标计算机上,您可以使用触发一次选项,这样笔记本电脑就不需要运行pemananently,例如。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),请参见以下内容。

在这种情况下,解决方案实际上非常简单。我刚刚在Azure Data Factory中创建了另一个管道,该管道由Blob创建事件触发,文件夹和文件名作为参数传递到我的笔记本。似乎工作得很好,只需要最少的配置或代码。基本的过滤可以通过事件完成,其余的由笔记本决定

对于遇到此场景的任何其他人,详细信息如下:


我喜欢使用结构化流媒体的想法。我将CSV文件作为输入,但它们在模式中有所不同,并且分布在子文件夹中。我想我已经把这两个问题都解决了(推断模式、全局模式),但是我很难将每个CSV写入各自的表(配置单元)。我在writeStream上使用了foreachBatch,但它似乎将各种不相关的文件收集到同一个目标表中,而不仅仅是通过Data Factory更新的单个文件。我会进一步研究这个问题,可能会编辑这篇文章,详细介绍这个具体的方法。好吧,你的情况似乎更复杂。是的,将拾取子曲面中的所有文件,最初为所有文件。Phps。您可以将该方法与文件夹混合作为数据工厂的参数(用于输入/输出和检查点目录)?