【问题标题】:Creating an array of columns from an array of column names in data flow从数据流中的列名数组创建列数组
【发布时间】:2021-08-31 23:20:11
【问题描述】:

如何从数据流中的列名数组创建列数组? 下面创建一个排序列数组,最后一列除外:

sort(slice(columnNames(), 1, size(columnNames()) - 1), compare(#item1, #item2))

我想为这个列名数组获取一个列数组。我试过这个:

toString(byNames(sort(slice(columnNames(), 1, size(columnNames()) - 1), compare(#item1, #item2))))

但我不断收到错误消息:

Column name function 'byNames' does not accept column or argument parameters 

谁能帮我解决这个问题?

【问题讨论】:

    标签: azure-data-factory azure-data-flow


    【解决方案1】:

    更新--

    似乎以任何方式(直接或将其分配给参数)使用 ColumnNames() 似乎会导致错误。在 Spark 上运行时,它被馈送到 byNames() 函数。由于无法直接在数据流中重新引入作为参数或分配变量,请参阅下面对我有用的方法。

    DataFLow 中有空字符串数组类型参数

    在带有参数sha2(256,byNames($cols))的派生列中照常使用sha2函数

    创建管道,使用 getMetadata 获取结构,从中可以获取列名。

    对于每一列,在 ForEach 活动中附加到一个变量。

    接下来,连接到 DataFLow 并传递包含列名的变量。

    byNames 函数的文档指出“计算输入不受支持,但您可以使用参数替换”。这解释了为什么应该使用参数作为输入来创建在 byNames 函数中使用的数组:

    示例:$cols 参数保存列列表。

    sha2(256,byNames(split($cols,',')))
    

    您可以通过在使用 in 函数之前创建数组来使用计算列名称作为输入。不要在函数调用中创建内联表达式,而是先在参数中设置列值,然后直接在函数中使用它。

    对于数组类型的参数$cols

    $cols = sort(slice(columnNames(), 1, size(columnNames()) - 1), compare(#item1, #item2))
    
    toString(byNames(sort(slice($cols, compare(#item1, #item2))))
    

    参考:byNames

    【讨论】:

    • 我听从了你的建议,但还是不行。目前,我正在对数据流参数中的列名称进行排序,然后使用排序名称的参数来使用 byNames 获取列,但我仍然遇到相同的错误。对于数据流参数; dropLeft(reduce(sort(slice(columnNames(), 1, size(columnNames()) - 1), compare(#item1, #item2)), '', #acc + ',' + #item, #result), 1)派生列表达式; sha2(256, dropLeft(reduce(array(toString(byNames(split($parameter2, ',')))), '', #acc + '|' + #item, #result), 1))
    • 我试过了,插入数组确实会得到结果,但是如果我们使用函数动态获取它们,byNames() 会抛出错误,因为它只需要数组并且在数组中动态获取列名似乎是棘手。请检查我在上面找到的一种更新方式
    • 我尝试了您更新的解决方案,虽然它按照介绍的方式工作,但它仍然不适用于我正在尝试做的事情。我需要对您未包含的列名数组进行排序。当我尝试排序然后生成排序列的哈希时,我仍然得到错误。如果有一种方法可以在数据流之前对数组进行排序,那可能会起作用。也就是说,如果我可以将排序数组传递给我的数据流。不幸的是,我无法找到一种方法来做到这一点。
    • 您可以使用 Azure 函数活动来旋转无服务器 python 或 powershell 环境,您可以在其中对从 forEach 活动输出传递的数组进行排序,并从函数活动响应中捕获排序后的数组以作为参数发送到 Dataflow。
    • 如果您也需要在回答中解释这一点,请告诉我
    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2020-03-08
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多