你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

映射数据流中的 select 转换

适用于: Azure 数据工厂 Azure Synapse Analytics

数据流在 Azure 数据工厂和 Azure Synapse 管道中均可用。 本文适用于映射数据流。 如果不熟悉转换,请参阅介绍性文章使用映射数据流转换数据

使用 select 转换对列执行重命名、删除或重新排序操作。 此转换不会更改行数据,但会选择哪些列是在下游传播的。

在 select 转换中,用户可指定固定映射、使用模式来执行基于规则的映射,也可启用自动映射。 可在同一 select 转换中同时使用固定映射和基于规则的映射。 如果某个列与定义的某个映射不匹配,则该列将被删除。

固定映射

如果投影中定义的列少于 50,则默认情况下,所有定义的列都将具有固定映射。 固定映射采用已定义的传入列,并将其映射为精确名称。

Fixed mapping

注意

不能使用固定映射来映射或重命名偏移列

映射分层列

固定映射可用于将分层列的子列映射到顶级列。 如果具有已定义的层次结构,请使用列下拉列表选择子列。 select 转换将创建一个包含子列的值和数据类型的新列。

hierarchical mapping

基于规则的映射

如果希望一次映射多个列或将偏移列传递到下游,请使用基于规则的映射来定义使用列模式的映射。 基于列的 nametypestreamposition 进行匹配。 可使用固定映射和基于规则的映射的任意组合。 默认情况下,列数大于 50 的投影都将默认为基于规则的映射,其在每列上进行匹配并输出所输入的名称。

若要添加基于规则的映射,请单击“添加映射”,然后选择“基于规则的映射” 。

Screenshot shows Rule-based mapping selected from Add mapping.

每个基于规则的映射需要两个输入:要匹配的条件以及每个映射列的名称。 这两个值都是通过表达式生成器输入的。 在左侧表达式框中,输入布尔值匹配条件。 在右侧的表达式框中,指定要将匹配的列映射到的项。

Screenshot shows a mapping.

使用 $$ 语法来引用匹配列的输入名称。 以上图为例,假设用户想要在名称长度不到 6 个字符的所有字符串列上进行匹配。 如果一个传入列被命名为 test,则表达式 $$ + '_short' 会将列重命名为 test_short。 如果这是存在的唯一映射,则所有不符合该条件的列都将从输出的数据中删除。

模式同时匹配偏移列和已定义的列。 若要查看由规则映射的已定义的列,请单击规则旁边的眼镜图标。 使用数据预览来验证输出。

正则表达式映射

如果单击向下的 V 形图标,可指定正则表达式映射条件。 对于与指定的正则表达式条件匹配的列名称,正则表达式映射条件与所有这些名称全部匹配。 这可与标准的基于规则的映射结合使用。

Screenshot shows the regex-mapping condition with Hierarchy level and Name matches.

上述示例与正则表达式模式 (r) 或任何包含小写 r 的列名匹配。 与标准的基于规则的映射类似,所有匹配的列都使用 $$ 语法由右侧的条件更改。

如果列名称中有多个正则表达式匹配项,可使用 $n 来指示特定匹配项(其中“n”表示具体的匹配项)。 例如,“$2”指列名称中的第二个匹配项。

基于规则的层次结构

如果定义的投影具有层次结构,则可使用基于规则的映射来映射层次结构子列。 指定匹配条件和要映射其子列的复杂列。 每个匹配的子列都将使用右侧指定的“名称为”规则进行输出。

Screenshot shows a rule-based mapping using for a hierarchy.

上面的示例与复杂列 a 的所有子列匹配。 a 包含两个子列 - bc。 “名称为”条件是 $$因此输出架构将包含两个列 - bc

参数化

可使用基于规则的映射对列名称进行参数化。 使用关键字 name 将传入列名称与参数匹配。 例如,如果你具数据流参数 mycolumn,则可创建匹配等于 mycolumn 的任何列名称的规则。 可将匹配的列重命名为硬编码的字符串(例如“业务键”),并显式引用它。 在此示例中,匹配条件为 name == $mycolumn,名称条件为“业务键”。

自动映射

添加 select 转换时,可切换“自动映射”滑块来启用自动映射。 启用自动映射后,select 转换会映射所有传入列(不包括重复列),其名称与它们的输入相同。 这将包括偏移列,这意味着输出数据可能包含未在架构中定义的列。 有关偏移列的详细信息,请参阅架构偏差

Auto mapping

启用自动映射后,select 转换将遵循跳过重复项设置,并为现有列提供新的别名。 在同一流和自联接方案中执行多个联接或查找时,别名非常有用。

重复列

默认情况下,select 转换会删除输入和输出投影中的重复列。 重复输入列通常来自联接和查找转换,其中列名称在联接的每一侧都是重复的。 如果将两个不同的输入列映射到同一名称,则可能产生重复输出列。 通过切换复选框选择是删除还是传递重复列。

Skip Duplicates

列排序

映射的顺序决定了输出列的顺序。 如果多次映射某个输入列,则只采用第一个映射。 在删除重复列时,将保留第一个匹配项。

数据流脚本

语法

<incomingStream>
    select(mapColumn(
        each(<hierarchicalColumn>, match(<matchCondition>), <nameCondition> = $$), ## hierarchical rule-based matching
        <fixedColumn>, ## fixed mapping, no rename
        <renamedFixedColumn> = <fixedColumn>, ## fixed mapping, rename
        each(match(<matchCondition>), <nameCondition> = $$), ## rule-based mapping
        each(patternMatch(<regexMatching>), <nameCondition> = $$) ## regex mapping
    ),
    skipDuplicateMapInputs: { true | false },
    skipDuplicateMapOutputs: { true | false }) ~> <selectTransformationName>

示例

下面是 select 映射及其数据流脚本的一个示例:

Select script example

DerivedColumn1 select(mapColumn(
        each(a, match(true())),
        movie,
        title1 = title,
        each(match(name == 'Rating')),
        each(patternMatch(`(y)`),
            $1 + 'regex' = $$)
    ),
    skipDuplicateMapInputs: true,
    skipDuplicateMapOutputs: true) ~> Select1

后续步骤

  • 使用 select 来对列执行重命名、重新排序和别名设置操作后,使用接收器转换将数据放入数据存储中。