Azure Kusto无法将值投影到用户定义的函数中
我有一个查询在我们的领域,我不能让它工作。我使用datatable来模拟我的问题。 我试图在用户定义的函数中使用投影值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)
// 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)