ADF 使用标头将数据从表复制到 Azure BlobADF Copy data from Table to Azure Blob with headers

ADF Copy data from Table to Azure Blob with headers

提问人:Charles 提问时间:11/16/2023 最后编辑:Charles 更新时间:11/17/2023 访问量:116

问:

我正在使用 ADF 将数据从 Snowflake 表(源)复制到 Azure Blob CSV 文件(接收器)。

接收器数据集选中了“第一行作为标题”。

如果源表包含数据,则效果很好。

但是,如果源表为空,则生成的文件为空,没有标头。

请参阅屏幕截图以获取设置。

我想知道如何使生成的文件带有标头,而不管源表是否为空。

谢谢。

source sink blob

azure-data-factory

评论

0赞 Skin 11/16/2023
也许您可以构建一个查询,以使用生成的数据在列标题(因此表示为记录而不是标题)上形成联合。你需要为此做一些聪明的事情,但我怀疑这将是相当直接的。这样,无论是否有数据,您始终可以获得标头记录。
0赞 Charles 11/17/2023
我知道有多种方法,例如使用 Union 标头,但我正在寻找一种更简单的方法。我很好奇是否存在这样的替代方案。
0赞 Skin 11/17/2023
是的,有......始终确保有记录。简单!

答:

0赞 Rakesh Govindula 11/17/2023 #1

您可以尝试以下解决方法,将标头复制到目标文件中。

  • 首先,使用查找活动检查表计数。然后使用 if activity 检查计数是否为。0
  • 添加两个复制活动,一个在 if 的 True 活动中,另一个在 false 活动中。
  • 对于这两个复制活动,您需要使用具有相同目标文件路径的不同目标数据集。
  • 一个复制活动是复制标头,如果计数不是,另一个活动是定期复制到目标文件。0

在查找中使用以下查询来获取表的计数。

select count(*) as count from emp

enter image description here

然后在 if 活动中给出以下表达式。

@equals(activity('Lookup1').output.value[0].COUNT,0)

在 if 的 True 活动中,使用以下查询获取复制活动的源。

select listagg(column_name,',') from information_schema.columns
where table_schema ilike 'public' and table_name ilike 'emp'

enter image description here

如果目标文件中的列分隔符是 ,则需要在上面的查询中使用而不是这样。||,listagg(column_name,'|')

这将使 Delimiter(,) 分隔的列名为一行,列名如下所示。LISTAGG(COLUMN_NAME,',')

LISTAGG(COLUMN_NAME,',')
Id,name

但在这里,我们只想要具有必需标题的行,而不是列名。

因此,在此复制活动的接收器数据集中,取消选中 并提供以下配置。这就是对两个复制活动使用不同数据集的原因。First row as header

enter image description here

您可以根据需要更改列分隔符,但还需要在查询中更改该分隔符

if 的 False 活动中,使用另一个目标数据集提供常规复制活动。

执行管道,标头将按如下所示复制到 Blob 中。

enter image description here