问题描述
在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的结果转换为一个表,但是我目前在使用这些函数时遇到一些性能问题,并试图将其切入表中。看看这是否可以解决这些问题
解决方法
内联输入
返回一个表。我想知道是否需要创建一个记录类型来指定每个记录条目的类型
// 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 因为类型归属只能改变函数的信息,不能改变函数在语言层面的行为,所以将类型归属于指定不同参数或返回断言的函数对函数的行为没有影响.混搭引擎始终使用最初定义函数时指定的类型断言,即使后来将另一种类型归于它。
查看 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