在Azure Data Factory v2中,我正在从管道调用映射数据流。数据流中的源和汇连接是参数化的,因此我可以为多个源/目标组合重用管道/数据流。然而,我想在数据流中创建一个派生列,它是特定源/目标组合的适当列的md5哈希。因此,我想将列列表传递到md5((函数中,该函数可以在数据流运行时进行评估,并且可以为每行数据生成适当的哈希值。目前我找不到让它发挥作用的方法。
我有一个字符串类型的数据流参数(pColumnList((数组没有类型选项(。管道传递一个字符串逗号分隔的列名列表,例如Col1、Col2、Col3并且派生列(ROW_HASH(具有代码/表达式md5($pColumnList)
,此时的问题是该函数正在对"Col1,Col2,Col3"的字符串值进行哈希,因此每行都具有相同的哈希值,而不是每行计算的哈希值。我还尝试将字符串拆分为一个数组,看看函数是否会将单独的项解释为列(即md5(split($pColumnList,','))
(,但这会导致一个错误,因为我认为md5函数不接受数组。
问题是,由于源是动态的,因此在数据流中没有定义的模式,表达式可以在设计时显式引用。我只是想知道这在adf映射数据流中是否根本不可能做到,事实上,我们要么需要为每个特定的源到目标进程创建一个单独的数据流,并使用显式的源和目标连接创建相应的可见模式。(或者可替换地,作为目标表中的计算列创建的散列(。
我们现在不允许在这些函数中使用数组值。
您是否希望为整行生成哈希/指纹?
如果这是你的目标,你需要使用以下方法之一:
-
使用toString(byPosition(1((+toString(byPositiong(2((+。。。在派生列中,将每个列连接到一个新列中,然后对该新列进行哈希运算。
-
如果源是一个文件,请使用不带分隔符的源数据集,该数据集只将整行作为单个字符串读取。这样,您就可以将整行作为一个可以散列的字符串(即col_1(。
https://www.youtube.com/watch?v=tc283k8CWh8
此演示演示如何获取列数组中的值。
md5(byName($PrimaryKey))
对于单个值或
md5(byNames(split($Columns, ',')))
对于split()
生成的阵列