我正在ADF中设置一个数据流,该数据流基于源架构中的数据字段,以Azure表数据集为源,添加派生列,该派生列添加名称为“文件名”和动态值的列。
然后将输出发送到接收器,该接收器链接到附加到Blob存储(尝试过ADLS Gen2和标准Blob存储)的数据集。
但是,执行管道之后,我没有在容器中找到多个文件,而是看到创建了一个名为filename=ABC123.csv
的文件夹,该文件夹本身包含其他文件(这使我想到了实木复合地板文件):
- filename=ABC123.csv
+ _started_UNIQUEID
+ part-00000-tid-UNIQUEID-guids.c000.csv
因此,我显然缺少了一些东西,因为我需要在数据集容器中列出单个文件,并在管道中指定名称。
这是管道的代码(但是某些部分已被删除):
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的新手,所以请多多包涵)
答案 0 :(得分:0)
我最近在与您的情况类似(但不完全相同)的情况下苦苦挣扎。这里有很多选项和活动部件,因此本篇文章并不详尽。希望其中的某些内容能够引导您获得所要的解决方案。
第1步:源分区
在数据流中,可以通过“设置分区”将类似的行分组在一起。众多选项之一是按键(源中的一列):
在此示例中,我们有51个美国州(50个州+ DC),因此最终会有51个分区。
第2步:接收器设置 如您所知,“作为列中的数据”选项将导致结构化的文件夹名称,例如{columnName} = {columnValue}。有人告诉我这是因为它是Hadoop / Spark类型环境中的标准。该文件夹中将包含一组文件,通常具有基于非人类友好GUID的名称。
“默认”将提供与当前相同的结果,但没有基于列的文件夹名称。 “输出到单个文件”是很不言自明的,是您寻求的解决方案中最遥远的东西。如果要控制最终文件名,我发现的最佳选择是“模式”选项。这将生成文件( s)具有指定的名称和可变数字[n]。老实说,我不知道每个分区会生成什么,但是它可能与您接近的结果是,每列1个文件值。
一些警告:
第3步:优化接收器
您可以尝试的最后一块是“优化”选项卡下的“水槽分区”:
“使用当前分区”将根据“源”配置中设置的分区对结果进行分组。 “单个分区”会将所有结果分组到一个输出组中(几乎可以肯定不是您想要的)。 “设置分区”将允许您基于“键”列对接收器数据进行重新分组。与接收器设置不同,此操作将允许您访问派生的列名,但是我的猜测是您最终将遇到与现在相同的文件夹命名问题。
此刻,这就是我所知道的。我相信这些选项的组合会产生您想要的东西或接近它的东西。您可能需要分多个步骤进行处理,例如将流输出到错误命名的文件夹到暂存位置,然后使用另一个管道/流来处理每个文件夹并将结果折叠为所需的名称。
答案 1 :(得分:0)