1

我在我们的域中有一个查询,我无法让它工作。我使用数据表来模仿我的问题。我正在尝试在用户定义的函数中使用投影值。

// 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)。

这里有 2 个要修改的查询。

第一次查询

第二次查询

谢谢

4

2 回答 2

3

有一种方法可以实现这一点(无需连接)是使用 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)
于 2019-04-16T16:27:54.567 回答
1

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

这是一个解决方法,可以实现您的目标(您也可以使用此查询链接直接运行它):

let f = (T:(d:int)) {
    let table1 = datatable (b:string, d:int) ["2015-12-31", 1, "2016-12-30", 2, "2014-01-05", 3]
    | as dataset;
    T
    | join (
       table1 
    ) on d
    | project b  
};

datatable (d:int) [1, 2, 3]
| as dataset
| invoke f()

测试结果如下:

在此处输入图像描述

于 2019-04-16T08:49:22.107 回答