Azure Synapse 映射数据流 - 派生列中列名的动态映射

Posted

技术标签:

【中文标题】Azure Synapse 映射数据流 - 派生列中列名的动态映射【英文标题】:Azure Synapse Mapping Data Flow - Dynamic mapping of column names in derived columns 【发布时间】:2021-07-07 16:01:02 【问题描述】:

在映射数据流活动中,我有一堆来自存储帐户未处理区域的表,我的目标是仅选择其中一些列用于下一个更多处理区域。在选择列时,我需要将列名转换为更直观的名称和/或小写名称。我打算使用参数来做到这一点,所以如果我需要进行调整,我只需要在一个地方更改它。

我管理了“简单”部分 - 将相关列名列入白名单并将这些名称设为小写。但是假设我想根据字典重命名列,其中列“abc”变为“def”,“ghi”变为“jkl”。我正在尝试使用列模式在派生列转换中执行此操作。我制作了一个地图参数(我不确定它的语法是否正确):

['abc'->'def', 'ghi' -> 'jkl']

我想我需要在翻译映射中找到匹配键的索引,然后用值数组中的正确索引替换它,但似乎没有一种简单的方法可以从函数中提取索引可在https://docs.microsoft.com/en-us/azure/data-factory/data-flow-expression-functions 获得。 这是我目前所拥有的,部分伪代码(index):

replace($$,find(keys($translation),#item == $$),values($translation)[*index*(keys($translation),#item == $$)])

我在这个问题上停留了太久,所以我希望有人能给我一些关于如何继续的想法。

任何帮助将不胜感激。

【问题讨论】:

你可以尝试使用这个表达式来获取索引:mapIf(keys($translation),#item == $$,#index)[1] 好主意。但是,我无法使表达式起作用。得到“无法评估表达式类型,更正表达式。”尝试values($translation)[mapIf(keys($translation),#item == $$,#index)[1]]toInteger() 包裹在#index 和整个mapIf 没有运气。不知道它在哪里失败。将不得不返回问题。 【参考方案1】:

我创建了一个简单的数据流进行测试。

来源数据预览:

参数:

然后我在DerivedColumn转换中测试了serval表达式:

1.在列模式中,使用下面的表达式replace($$,find(keys($translation),toString(#item) == $$),values($translation)[mapIf(keys($translation),toString(#item) == $$,#index)[1]]),这是行不通的。通过mapIf(keys($translation), 1 == 1, concat($$, $$))这个表达式,我发现mapIf()中的$$函数不起作用(它返回abc和ghi,期望值为abcabc和ghighi)。我不确定这是一个错误还是 ADF 团队是这样设计的。

2.然后我没有使用列模式只是添加列尝试:replace(col1,find(keys($translation),toString(#item) == col1),values($translation)[mapIf(keys($translation),toString(#item) == col1,#index)[1]])replace(col2,find(keys($translation),toString(#item) == col2),values($translation)[mapIf(keys($translation),toString(#item) == col2,#index)[1]])

它可以得到正确的值:

结论:

不要使用列模式,只添加列,然后使用这个表达式:replace(columnName,find(keys($translation),toString(#item) == columnName),values($translation)[mapIf(keys($translation),toString(#item) == columnName,#index)[1]])

【讨论】:

问题是我想在所有表上使用一般规则,这些表可能都有不同的列数。示例:我将一个表从“原始”数据库转移到一个“已处理”数据库,并且我在 Raw 中有 3 个表。它们有 15、25 和 48 列。我想保留与 $translation 数组的键中的条目相对应的每个表。表 1 有“abc”、“ghi”和“mno”列,但表 2 和 3 只有“abc”和“ghi”。如果我使用你的方法,我需要知道每个表有多少匹配列,对吗?这很难维护,因为许多表都有 100 多列和 50 多个匹配键。 我想保留每个 column 对应于 $translation 数组/映射的键中的条目,对不起。 @我明白了。我还没有找到任何方法来实现这一点。根据我的测试,似乎 $$ 在 find() 和 mapIf() 方法中不起作用。如果您有任何解决方案,请发布。谢谢。

以上是关于Azure Synapse 映射数据流 - 派生列中列名的动态映射的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 缺少列名错误,Azure Synapse 分析笔记本中的数字列名

Azure Synapse Analytics:我可以在散列分布式表中使用非唯一列作为散列列吗?

如何在 t-sql (Azure Synapse) 的 CAST/CONVERT 中使用字符串函数

Azure Synapse Sql 池未从 Azure Synapse Studio 数据流接收数据

我想为在 MS Azure Synapse 中存储为 varchar(max) 的匹配标记提取 XML 值

Azure Synapse 专用 sql 池未在 Synapse Studio 中显示数据对象