Сводное содержимое столбца массива в обозревателе данных Azure

У меня есть некоторые данные, хранящиеся в пакете свойств 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()

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


person ericksoen    schedule 30.11.2018    source источник


Ответы (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)

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

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)

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

person Yoni    schedule 30.11.2018
comment
Ваше предостережение хорошо принято, поскольку у меня возникают проблемы с интеграцией ваших предложений в свойство customDimensions, в котором хранятся мои данные (согласно оператору getschema, сообщаемый тип данных - dynamic, поэтому неясно, в чем заключается моя проблема интеграции: например, когда Я запускаю этот запрос и получаю сообщение об ошибке Убедитесь, что выражение: items.siteName действительно простое имя let foo = customEvents | where name == 'Заблокировать выбранные файлы:' | project customDimensions; print bar = tostring (foo.siteName); - person ericksoen; 30.11.2018
comment
насколько я могу прочитать этот последний запрос, foo на самом деле является таблицей с одним столбцом (и N строками). так что то, что вы пытаетесь сделать, действительно недействительно. Если я попытаюсь определить намерение из запроса, попробуйте следующее: customEvents | where name == 'Lock files selection submitted:' | project bar = tostring(customDimensions.siteName). позвольте мне также предложить: используйте оператор datatable, чтобы предоставить синтетический набор данных, который представляет ваш набор данных, и затем мы можем работать с ним (вместо того, чтобы пытаться работать с ограниченными примерами, которые не отражают реальный вариант использования). - person Yoni; 30.11.2018
comment
Я не думал об использовании таблицы данных для создания синтетического набора данных. Это должно быть более репрезентативным для моей структуры данных: 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]}) ] - person ericksoen; 02.12.2018
comment
Спасибо. Я добавил примеры, основанные на этом наборе данных, в исходный ответ, надеюсь, это ответит на исходный вопрос более актуальным образом. - person Yoni; 02.12.2018