Агрегирование содержимого столбца массива в проводнике данных Azure - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть некоторые данные, хранящиеся в пакете свойств customEvents, для которого я хочу выполнить агрегацию и аналитику.Я новичок в аналитических запросах, которые вы можете запускать для AppInsights с помощью языка запросов Azure Data Explorer, и я застрял.

У меня есть дескриптор при преобразовании содержимого одной из пар ключ-значение пакета свойствв массив чисел (в приведенном ниже примере этот вывод представлен как items.

let items = parse_json('{"operation_Id": "12345Z12", "days":[43, 21, 65]}');
print items.operation_Id, items.days;

Однако, когда мне нужно вычислить среднее значение элементов в массиве для каждого параметра operation_Id, янаткнуться на стену документации. Я посмотрел на mvexpand, let (с использованием лямбда-выражения), datatable, с использованием динамических типов данных и т. д. Проблема с блокировкой, с которой я столкнулся при использовании mvexpand, заключается в том, чтоЯ хочу связать каждую строку в выходных данных, связанную с ее операцией operation_Id, и mvexpand, кажется, только сохраняет эту связь в первой строке. С datatable тип не поддерживает вход конвейера.

Другая распространенная ошибка, с которой я столкнулся (в том числе из приведенного ниже примера кода: Выражение источника оператора должно быть таблицей или столбцом ).

let items = parse_json('{"days":[43, 21, 65]}');

let arraySum = (T:(x: long))
{
   T 
   | summarize sum(x) 
};
items
| project days | invoke arraySum()

Если neВдобавок, я могу выполнить код агрегации в JavaScript и передать только вычисленное среднее значение в пакете свойств, но это кажется пустой тратой на то, чтобы выбросить значения необработанных данных.Есть ли какая-то очевидная функция вычисления или агрегирования, которая решает эту проблему?

1 Ответ

0 голосов
/ 30 ноября 2018

Обе следующие опции должны позволять вам вычислять среднее значение, которое вас интересует:

( предостережение: это основано на показанном вами примере, который потенциально может быть "тупым"вниз ", чтобы не отражать ваш реальный сценарий, поэтому, пожалуйста, уточните, если это не поможет ):

let items = dynamic({"operation_Id": "12345Z12", "days":[43, 21, 65]});
print operationId = tostring(items.operation_Id), days = items.days
| mvexpand days to typeof(int)
| summarize avg(days) by operationId

// or

let items = dynamic({"operation_Id": "12345Z12", "days":[43, 21, 65]});
print operationId = tostring(items.operation_Id), days = items.days
| project operationId, series_stats_dynamic(days)['avg']

Ваш второй пример действительно неверен (скаляры и табличные аргументы не равны), но может быть переписано следующим образом:

( то же предостережение, что и выше )

let items = dynamic({"days":[43, 21, 65]});
let arraySum = (T:(x: long))
{
   T 
   | summarize sum(x) 
};
print items 
| mvexpand x = items.days to typeof(long)
| invoke arraySum()

// or

let items = dynamic({"days":[43, 21, 65]});
print items
| project sum = series_stats_dynamic(items.days)["avg"] * array_length(items.days)

Обновлены примеры послекомментарии, представленные позже:

datatable (Operation_id:string, customDimensions:dynamic) 
[ 
    "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
    "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
    "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
    "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
]
| mvexpand days = customDimensions.pendingDays to typeof(int)
| summarize avg(days) by Operation_id

// or

datatable (Operation_id:string, customDimensions:dynamic) 
[ 
    "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
    "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
    "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
    "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
]
| project Operation_id, series_stats_dynamic(customDimensions.pendingDays)['avg']

и:

let arraySum = (T:(x: long))
{
   T 
   | summarize sum(x) 
};
datatable (Operation_id:string, customDimensions:dynamic) 
[ 
    "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
    "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
    "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
    "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
]
| mvexpand x = customDimensions.pendingDays to typeof(long)
| invoke arraySum()

// or

datatable (Operation_id:string, customDimensions:dynamic) 
[ 
    "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
    "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
    "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
    "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
]
| project Operation_id, sum = series_stats_dynamic(customDimensions.pendingDays)["avg"] * array_length(customDimensions.pendingDays)

Некоторые ссылки на операторы / функции, использованные выше:

...