Кусто не может проецировать значение в пользовательскую функцию - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть запрос в нашем домене, который я не могу заставить его работать.Я использовал датированный, чтобы подражать моей проблеме.Я пытаюсь использовать проецируемое значение в пользовательской функции.

// 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 запроса, с которыми нужно повозиться.

первый запрос

секундазапрос

спасибо

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Существует способ достичь этого (без объединения) - создать динамическую карту (пакет свойств) с помощью 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)
0 голосов
/ 16 апреля 2019

Это ограничение пользовательской функции, 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()

Результат теста, как показано ниже:

enter image description here

...