【问题标题】:Can md5 function be passed a dynamic list of columns via a Parametermd5函数可以通过参数传递动态列列表吗
【发布时间】:2020-02-25 18:50:36
【问题描述】:

在 Azure 数据工厂 v2 中,我从管道调用映射数据流。数据流中的源和接收器连接是参数化的,因此我可以为多个源/目标组合重用管道/数据流。但是我想在数据流中创建一个派生列,它是该特定源/目标组合的适当列的 md5 哈希。因此,我想将列列表传递给 md5() 函数,该函数可以在数据流运行时进行评估,并且可以为每行数据生成适当的哈希值。目前我找不到让它工作的方法。

我有一个字符串类型的数据流参数 (pColumnList)(数组没有类型选项)。管道传递一个字符串逗号分隔的列名列表,例如 Col1、Col2、Col3 并且派生列(ROW_HASH)具有代码/表达式md5($pColumnList) 目前的问题是该函数正在散列“Col1,Col2,Col3”的字符串值,因此每一行都具有相同的散列值而不是散列每行计算。我还尝试将字符串拆分为一个数组,以查看该函数是否会将单独的项目解释为列,即 md5(split($pColumnList,',')) 但这会导致错误,因为我认为 md5 函数不接受数组。

问题在于,由于源是动态的,因此表达式在设计时可以明确引用的数据流中没有定义的架构。我只是想知道这在 adf 映射数据流中是否根本不可能做到,事实上,我们需要为每个特定源创建单独的数据流到目标进程,并使用显式的源和目标连接创建它们的适当架构可见. (或者在目标表中创建为计算列的哈希)。

【问题讨论】:

    标签: expression md5 azure-data-factory azure-data-factory-2


    【解决方案1】:

    我们今天不允许在这些函数中使用数组值。

    您是否要为整行生成哈希/指纹?

    如果这是您的目标,您需要使用以下方法之一:

    1. 在派生列中使用 toString(byPosition(1))+toString(byPositiong(2))+ ... 并将每一列连接到一个新列中,然后对该新列进行哈希处理。

    2. 如果源是文件,请使用不带分隔符的源数据集,它将整行作为单个字符串读取。这样,您可以将整行作为一个字符串(即 col_1)进行散列。

    【讨论】:

    • 感谢标记 toString(byPosition(n)+..) 在这种情况下对我有用,我可以根据我们需要的列从元数据构造一个表达式并将其传递到派生列.
    【解决方案2】:

    https://www.youtube.com/watch?v=tc283k8CWh8

    此演示展示了如何获取列数组中的值。

    md5(byName($PrimaryKey))
    

    单值或

    md5(byNames(split($Columns, ',')))
    

    对于split()生成的数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多