Агрегировать содержимое столбца массива в проводнике данных Azure
У меня есть некоторые данные, хранящиеся в пакете свойств customEvents, для которого я хочу выполнить агрегацию и аналитику. Я новичок в аналитических запросах, которые вы можете запускать в AppInsights с помощью языка запросов Azure Data Explorer, и я застрял.
У меня есть ручка для преобразования содержимого одной из пар ключ-значение пакета свойств в массив чисел (в приведенном ниже примере этот вывод представлен items
,
let items = parse_json('{"operation_Id": "12345Z12", "days":[43, 21, 65]}');
print items.operation_Id, items.days;
Однако, когда мне нужно вычислить среднее значение элементов в массиве для каждого идентификатора операции, я сталкиваюсь со стеной документации. Я смотрел на 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()
При необходимости я могу выполнить код агрегации в JavaScript и передать только вычисленное среднее значение в пакете свойств, но это кажется пустой тратой на выброс значений необработанных данных. Есть ли какая-то очевидная функция вычисления или агрегирования, которая решает эту проблему?
1 ответ
Обе следующие опции должны позволить вам рассчитать среднее значение по вашему усмотрению:
(предостережение: это основано на примере, который вы показали, который потенциально может быть "ошарашен", чтобы не отражать ваш реальный сценарий, поэтому, пожалуйста, уточните, если это не поможет):
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)
Некоторые ссылки на операторы / функции, используемые выше: