Azure Kusto无法将值投影到用户定义的函数中

Azure Kusto无法将值投影到用户定义的函数中,azure,azure-data-explorer,kql,Azure,Azure Data Explorer,Kql,我有一个查询在我们的领域,我不能让它工作。我使用datatable来模拟我的问题。 我试图在用户定义的函数中使用投影值 // this works let f = (a:int) { datatable (b:string, d:int) ["2015-12-31", 1, "2016-12-30", 2, "2014-01-05", 3] | as dataset | where d == a | project b; }; datatable (d:int)

我有一个查询在我们的领域,我不能让它工作。我使用datatable来模拟我的问题。 我试图在用户定义的函数中使用投影值

// this works
let f = (a:int) {
    datatable (b:string, d:int) ["2015-12-31", 1, "2016-12-30", 2, "2014-01-05", 3]
    | as dataset
    | where d == a
    | project b;
};
datatable (d:int) [1, 2, 3]
| as dataset
| project toscalar(f(2))

// this doesnt work, why is the 'd' not used (projected) in function q. 
// if I add toscalar to the project it also doesnt work
let f = (a:int) {
    datatable (b:string, d:int) ["2015-12-31", 1, "2016-12-30", 2, "2014-01-05", 3]
    | as dataset
    | where d == a
    | project b;
};
datatable (d:int) [1, 2, 3]
| as dataset
| project toscalar(f(d))
我在这里遗漏了什么,我希望“|project”为每个结果使用函数(f)

这里有两个需要修改的查询


感谢

这是用户定义函数的限制,不能为每行值调用toscalar()。你可以看看这些限制

这里有一个变通方法,可以实现您的目标(您也可以使用它直接运行):

测试结果如下:


有一种方法可以实现这一点(无连接),即使用toscalar()创建一个动态映射(属性包),然后将其用作查找字典

let f = (a:int) {
    let _lookup = toscalar 
    (
        datatable (b:string, d:int) ["2015-12-31", 1, "2016-12-30", 2, "2014-01-05", 3]
        | extend p = pack(tostring(d), b)
        | summarize make_bag(p)
     );
    _lookup[tostring(a)]
};
datatable (d:int) [1, 2, 3]
| project result=f(d)

这是自定义函数的限制,列不能用作自定义函数的参数。你可以看看评论不正确的限制。列值可以发送到用户定义的函数。该示例不起作用的原因是将“toscalar()”与行上下文一起使用(这意味着不能为每个行值调用toscalar()。@AlexanderSloutsky,你说得对。我只是想把它解释得更简单一些,但给出了一个错误的解释,我的坏方法。聪明的方法:)相比于
JOIN
,它在大型数据集上的性能如何?当您拥有包含数百个项的静态数据集时,这种方法非常有效。若数据集增长超过该值且仍低于1M值,则最好使用带有“广播”提示或“查找”运算符的join(性能)。如果数据集超出了这一范围,洗牌连接方法就会出现。(谷歌:“kusto查找”、“kusto广播加入”、“kusto洗牌加入”-了解更多详细信息)您好,如果答案有效,请帮助将其标记为答案。谢谢
let f = (a:int) {
    let _lookup = toscalar 
    (
        datatable (b:string, d:int) ["2015-12-31", 1, "2016-12-30", 2, "2014-01-05", 3]
        | extend p = pack(tostring(d), b)
        | summarize make_bag(p)
     );
    _lookup[tostring(a)]
};
datatable (d:int) [1, 2, 3]
| project result=f(d)