Azure数据工厂中数据流中的动态outputfilename导致文件夹而不是文件

时间:2020-04-02 12:30:30

标签: azure-data-factory

我正在ADF中设置一个数据流,该数据流基于源架构中的数据字段,以Azure表数据集为源,添加派生列,该派生列添加名称为“文件名”和动态值的列。

然后将输出发送到接收器,该接收器链接到附加到Blob存储(尝试过ADLS Gen2和标准Blob存储)的数据集。

但是,执行管道之后,我没有在容器中找到多个文件,而是看到创建了一个名为filename=ABC123.csv的文件夹,该文件夹本身包含其他文件(这使我想到了实木复合地板文件):

- filename=ABC123.csv
  + _started_UNIQUEID
  + part-00000-tid-UNIQUEID-guids.c000.csv

因此,我显然缺少了一些东西,因为我需要在数据集容器中列出单个文件,并在管道中指定名称。

这是管道的外观: Screenshot

“水槽”形状的“优化”选项卡如下所示: enter image description here

在这里您可以看到水槽形状的设置: enter image description here

这是管道的代码(但是某些部分已被删除):

source(output(
        PartitionKey as string,
        RowKey as string,
        Timestamp as string,
        DeviceId as string,
        SensorValue as double
    ),
    allowSchemaDrift: true,
    validateSchema: false,
    inferDriftedColumnTypes: true) ~> devicetable
devicetable derive(filename = Isin + '.csv') ~> setoutputfilename
setoutputfilename sink(allowSchemaDrift: true,
    validateSchema: false,
    rowUrlColumn:'filename',
    mapColumn(
        RowKey,
        Timestamp,
        DeviceId,
        SensorValue
    ),
    skipDuplicateMapInputs: true,
    skipDuplicateMapOutputs: true) ~> distributetofiles

有什么建议或提示吗? (我是ADF的新手,所以请多多包涵)

2 个答案:

答案 0 :(得分:0)

我最近在与您的情况类似(但不完全相同)的情况下苦苦挣扎。这里有很多选项和活动部件,因此本篇文章并不详尽。希望其中的某些内容能够引导您获得所要的解决方案。

第1步:源分区 在数据流中,可以通过“设置分区”将类似的行分组在一起。众多选项之一是按键(源中的一列): enter image description here

在此示例中,我们有51个美国州(50个州+ DC),因此最终会有51个分区。

第2步:接收器设置 如您所知,“作为列中的数据”选项将导致结构化的文件夹名称,例如{columnName} = {columnValue}。有人告诉我这是因为它是Hadoop / Spark类型环境中的标准。该文件夹中将包含一组文件,通常具有基于非人类友好GUID的名称。

“默认”将提供与当前相同的结果,但没有基于列的文件夹名称。 “输出到单个文件”是很不言自明的,是您寻求的解决方案中最遥远的东西。如果要控制最终文件名,我发现的最佳选择是“模式”选项。这将生成文件( s)具有指定的名称和可变数字[n]。老实说,我不知道每个分区会生成什么,但是它可能与您接近的结果是,每列1个文件值。

enter image description here

一些警告:

  • 文件夹名称是在接收器数据集中定义的,而不是在数据流中定义的。数据集参数实际上可能是“步骤0”。对于Blob类型的输出,您可能可以对文件夹名称进行硬编码,例如“ myfolder / fileName- [n]”。 YMMV。
  • 不幸的是,这些选项都不允许您使用派生列来生成文件名。 [如果您打开表达式 编辑器,您会发现未填充“传入模式”。]

第3步:优化接收器 您可以尝试的最后一块是“优化”选项卡下的“水槽分区”: enter image description here

“使用当前分区”将根据“源”配置中设置的分区对结果进行分组。 “单个分区”会将所有结果分组到一个输出组中(几乎可以肯定不是您想要的)。 “设置分区”将允许您基于“键”列对接收器数据进行重新分组。与接收器设置不同,此操​​作将允许您访问派生的列名,但是我的猜测是您最终将遇到与现在相同的文件夹命名问题。

此刻,这就是我所知道的。我相信这些选项的组合会产生您想要的东西或接近它的东西。您可能需要分多个步骤进行处理,例如将流输出到错误命名的文件夹到暂存位置,然后使用另一个管道/流来处理每个文件夹并将结果折叠为所需的名称。

答案 1 :(得分:0)

您正在数据集文件夹路径中看到Spark进程遗留的幻影文件。当您使用“列中的数据”时,ADF将从容器根开始使用您的字段值写入文件。

您会在“带有文件名的列”属性中看到这一点:

enter image description here

因此,如果导航到存储容器根目录,则应该看到ABC123.csv文件。

现在,如果要将该文件放在文件夹中,只需在“派生列”转换公式中将该文件夹名放在前面,就像这样:

“输出/文件夹1 / {Isin} .csv”

双引号激活ADF的字符串插值。您可以通过这种方式将文字文本与公式结合在一起。