Amazon web services CloudWatch Insights查询-如何从计数中获取单个计数

Amazon web services CloudWatch Insights查询-如何从计数中获取单个计数,amazon-web-services,amazon-cloudwatch,amazon-cloudwatchlogs,aws-cloudwatch-log-insights,Amazon Web Services,Amazon Cloudwatch,Amazon Cloudwatchlogs,Aws Cloudwatch Log Insights,我有一个包含playerId值的日志文件,有些玩家在该文件中有多个条目。我想得到一个确切的独特的计数,以独特的球员,无论他们是否有一个或多个条目在日志文件中 使用下面的查询,它扫描497条记录并找到346个唯一行(346是我想要的数字) 查询: 如果我将查询改为使用count_distinct,我会得到我想要的结果。示例如下: fields @timestamp, @message | sort @timestamp desc | filter @message like /(playerId

我有一个包含playerId值的日志文件,有些玩家在该文件中有多个条目。我想得到一个确切的独特的计数,以独特的球员,无论他们是否有一个或多个条目在日志文件中

使用下面的查询,它扫描497条记录并找到346个唯一行(346是我想要的数字) 查询:

如果我将查询改为使用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(),而不是count\u 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(*) 
我们在理解查询时遇到问题


为了清楚起见,我希望在显示数字的单行中返回一个精确的计数

如果我们引入一个硬编码为“1”的虚拟字段会怎么样?其思想是检索其最小值,以便即使相同的
playerId
多次出现,它仍保持为“1”。然后我们对这个场求和

日志条目可能如下所示:

[1]"playerId": "1b45b168-00ed-42fe-a977-a8553440fe1a"
查询:

fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/ 
| parse @message "[*]\"playerId\": \"*\"" as dummyValue, playerId
| stats sum(min(dummyValue)) by playerId as CT 
使用的参考资料:


删除我以前的评论。这可能会起作用,但是日志中没有我可以键入的数据,如您的示例[1]-因此,如果没有这些数据,您的示例将无法在我的情况下工作。。。
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/ 
| parse @message "[*]\"playerId\": \"*\"" as dummyValue, playerId
| stats sum(min(dummyValue)) by playerId as CT