У меня есть файл журнала, который содержит значения playerId, некоторые проигрыватели имеют несколько записей в файле. Я хочу получить точное количество уникальных игроков, независимо от того, есть ли у них 1 или несколько записей в лог-файле.
Используя запрос ниже, он сканирует 497 записей и находит 346 уникальных строк (346 - это желаемое число). Запрос:
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/
| parse @message "\"playerId\": \"*\"" as playerId
| stats count(playerId) as CT by playerId
Если я изменю свой запрос на использование count_distinct, я получу именно то, что хочу. Пример ниже:
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/
| parse @message "\"playerId\": \"*\"" as playerId
| stats count_distinct(playerId) as CT
Однако проблема с count_distinct заключается в том, что при расширении запроса на больший таймфрейм или большее количество записей количество записей получается на тысячи и десятки тысяч. Это создает проблему, поскольку числа становятся аппроксимациями из-за характера поведения Insights count_distinct ...
"Возвращает количество уникальных значений для поля. Если поле имеет очень большую мощность (содержит много уникальных значений ) значение, возвращаемое count_distinct, является лишь приблизительным. "
Документы: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
Это недопустимо, поскольку мне требуются точные цифры. Немного поиграв с запросом и придерживаясь count (), а не count_distinct (), я считаю, что это ответ, однако я не смог найти ни одного числа ... Примеры, которые не работают ... Любые мысли ?
Пример 1:
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/
| parse @message "\"playerId\": \"*\"" as playerId
| stats count(playerId) as CT by playerId
| stats count(*)
У нас возникли проблемы с пониманием запроса.
Чтобы было ясно, я ищу точный счет должен быть возвращен в одной строке с указанием номера.