【问题标题】:Azure Data Factory how to derive empty to null value with dynamic columnsAzure 数据工厂如何使用动态列将空值派生为空值
【发布时间】:2020-10-23 04:49:34
【问题描述】:

Azure 数据工厂的数据流中的“派生列”步骤是否能够在遍历具有不同列数的多个文件时动态检测空值并替换为 NULL 值?

我想要做的是将 10 个 csv 文件直接复制到 10 个表中,而不进行任何操作,但只用 NULL 替换空值。这 10 个文件中的每一个都包含 5-25 列。我知道我可以构建 10 个数据流来实现这一点,但想知道是否有更智能的方法来查找文件列表和 FOREACH 文件动态替换空值?

更新:

感谢约瑟夫的回答。似乎数据流会自动将空值视为 NULL。但是我又遇到了另一个解析问题,即 Sink 中的日期/时间/日期时间列接收 NULL 值。

来源: 日期/时间/日期时间列的位置在每个文件中不固定,也不具有相同的列名。由于源是 CSV 格式,所有列都被视为字符串类型,不能使用“类型”进行模式匹配:https://i.stack.imgur.com/X1C7z.png

水槽: 从上面的示例中,所有突出显示的列都在 Sink 中作为 NULL 传输:https://i.stack.imgur.com/PecRb.png

【问题讨论】:

  • 你的 csv 文件有标题吗?在我的回答中,它必须有。
  • 是的,他们有标题

标签: azure-data-factory


【解决方案1】:

是的,我们可以。在我的测试中,我通过一个数据流将 2 个 csv 文件复制到 2 个表中。

  1. 我创建了一个名为Objects 的数组变量。它的格式是这样的[{"source":"nullValue1.csv","sink":"TestNull"},{"source":"nullValue2.csv","sink":"TestNull2"}]。在您的情况下,您可以将 10 个对象添加到数组中。

  1. 然后我们可以 foreach 对象数组:

  1. 在 ForEach 活动中,我们可以定义一个数据流。

  1. 我们可以输入动态内容@item().source动态指定文件名。

  1. 重点来了,我们可以在DerivedColumn中添加一个列模式,使用iifNull($$,toString(null()))检测每一列的空值并替换为NULL值。

  1. 在sink中,我们可以输入动态内容@item().sink在SQL中指定表名。



更新

我的原始日期格式是这样的:11/04/2020 1:17:40

根据这个documnet,我们可以使用name选项来指定需要进行日期格式转换的列。

这里我们可以使用表达式toString(toTimestamp(toString($$),'MM/dd/yyyy HH:mm:ss'),'yyyy-MM-dd HH:mm:SS')来转换日期格式。

结果显示,我们可以看到Column4

第 2 部分
我们应该将/ 替换为-

第一个模式1==1&&name!='ClockingDate'&&name!='CreationDate'&&name!='ClockingTime'
其他如下:

数据预览如下:

【讨论】:

  • 可能你的日期格式ADF无法识别,可以参考question转换日期格式。
  • 能否给我看一个关于日期时间类型的示例数据?
  • 日期栏的订单位置是否固定?
  • 嗨@Ben S,请查看我更新后的部分答案。
  • 嗨@Ben S,请查看我更新后的回答的第 2 部分。
猜你喜欢
  • 2021-11-24
  • 2022-01-07
  • 2020-08-03
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2019-03-09
  • 2020-08-12
相关资源
最近更新 更多