Power Query Table.TransformRows 不会返回表

Posted

技术标签:

【中文标题】Power Query Table.TransformRows 不会返回表【英文标题】:Power Query Table.TransformRows won't return table 【发布时间】:2020-09-03 08:13:33 【问题描述】:

在 Table.TransformRows 的 M 语言文档中,它将类型签名列为 Table.TransformRows(table as table, transform as function) as list 接下来是略显神秘的评论

如果指定了转换函数的返回类型,则结果将是具有该行类型的表。

但是,每当我定义我的函数时,Power Query 总是返回一个列表而不是一个表。 例如,这个查询:

    func = (row) as record => [B = Number.ToText(row[a])] as record,
    #"firstTable"= Table.FromRecords(
            [a = 1],
            [a = 2],
            [a = 3],
            [a = 4],
            [a = 5]),
    #"myTable" = Table.TransformRows(#"firstTable",func)
in
  #"myTable"

返回一个表。 我想知道是否需要创建一个记录类型来指定每个记录条目的类型,但如果我尝试

myType = type [B = text],
func = (row) as record => [B = Number.ToText(row[a])] as myType

然后它告诉我我的类型标识符在第二行无效。最后,我尝试使用

设置函数返回类型
myType = type [B = text],
func1 = (row) as record => [B = Number.ToText(row[a])] as myType,
funcType = Type.ForFunction([ReturnType = myType, Parameters = [X = type number]], 1),
func = Value.ReplaceType(func1,funcType)

但是 Table.TransformRows 仍然返回一个列表。

我知道我可以使用 Table.FromRecords 或 Table.FromRows 将 Table.TransformRows 的结果转换为表格,但我目前遇到了这些函数的一些性能问题,并试图将它们删除到看看这是否能解决这些问题

【问题讨论】:

【参考方案1】:

内联输入

返回一个表。我想知道是否需要创建一个记录类型来指定每个记录条目的类型

// you had this
record_list =  [ a = 1 ], [ a = 2 ], [ a = 3 ], [ a = 4 ], [ a = 5 ] ,
firstTable = Table.FromRecords(
    record_list
)

最后是type any 的列。要解决这个问题:

// declare the type
firstTable = Table.FromRecords(
    record_list,
    type table[a = text]
)

只要函数采用参数columns as any,您就可以使用这些格式中的任何一种

"Name" ` "Name1", "Name2" type table[ Name1 = text, Name2 = number ]

类型标识符无效

然后它告诉我我的类型标识符在第二行无效

as 运算符仅适用于 primitive 数据类型。

如果它起作用,这意味着断言记录是myType,然后函数返回断言类型是record,这是混合类型。该函数已经有一个最终断言,因此您的内部调用不需要一个。

func = (row) as record => [B = Number.ToText(row[a])] as something

替换函数类型不会改变行为

最后,我尝试使用 ... Value.ReplaceType 设置函数返回类型

在函数上使用Value.ReplaceType 不会修改实际类型或行为。这只是更改元数据。

Ben Gribaudo: /part18-Custom-Type-Systems 由于类型归属只能更改有关函数的信息,而不是语言级别的函数行为,因此将类型赋予指定不同参数或返回断言的函数对函数的行为没有影响。 mashup 引擎始终使用最初定义函数时指定的类型断言,即使后来赋予了另一种类型。

查看 Ben 的 Power Query 系列。这是高质量的。它比其他地方详细得多。

性能

我知道我可以使用 Table.FromRecords 或 Table.FromRows 将 Table.TransformRows 的结果转换为表格,但我目前遇到了一些性能问题

缺少列数据类型可能会导致问题。但是你真的应该试试query diagnostics,它会告诉你哪些步骤花费的时间最多。

根据您的示例,您可能需要转换列而不是行。

还要确保您的查询是折叠的!

使用 Table.TransformRows 键入的示例

let   
    // sample data, list of records like: [ Number = 0 ]
    numberRecords = List.Transform( 0..10, each [Number = _] ),
    Source = Table.FromRecords(
        numberRecords,
        type table[Number = number]
    ),

    transform_SquareNumbers = (source as table) => 
        let 
            rows = Table.TransformRows(
                source, (row) as record =>
                    [
                        Number = Number.Power(
                            row[Number], 2
                        )
                    ]
            ),
            result = Table.FromRecords(rows),
            source_type = Value.Type(source)
        in
            Value.ReplaceType(result, source_type),   
    
    FinalTable = transform_SquareNumbers(Source)
in
    FinalTable

【讨论】:

以上是关于Power Query Table.TransformRows 不会返回表的主要内容,如果未能解决你的问题,请参考以下文章

power query展开表时动态获取要展开的列

power query插件应用案例(二)

power query如何实现增加空白行

Power Query初识

Power-BI:在数据区添加列或在 Power-Query 中添加列

power query中M函数和处理数据