我有一个包含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的问题是,随着查询扩展到更大的时间范围/更多记录,条目的数量将成千上万。由于洞察力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(*)
我们难以理解查询。
要清楚,我正在寻找要在显示数字的一行中返回的确切计数。
我有一个包含playerId值的日志文件,有些球员在文件中有多个条目。我想获得唯一身份玩家的确切数量,无论他们是否有1个或多个...
如果我们引入一个硬编码为“ 1”的虚拟字段怎么办?这个想法是检索其最小值,以便即使相同的playerId
出现多次也保持为“ 1”。然后我们对该字段求和。