AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?

Posted

技术标签:

【中文标题】AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?【英文标题】:Duplicate results in an AWS Athena (Presto) DISTINCT SQL Query? 【发布时间】:2017-06-17 15:38:17 【问题描述】:

我在 S3 上有一堆只包含 MD5 的文件,每行一个。我创建了一个 AWS Athena 表来对 MD5 运行重复数据删除查询。这些文件和表格中总共有数亿个 MD5。

Athena 表创建查询:

CREATE EXTERNAL TABLE IF NOT EXISTS database.md5s (
  `md5` string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://bucket/folder/';

以下是我尝试过的所有“去重”查询(这些都应该相同):

SELECT DISTINCT md5
FROM md5s;`

SELECT md5
FROM md5s
GROUP BY md5;

SELECT md5
FROM md5s
GROUP BY DISTINCT md5;

SELECT DISTINCT md5
FROM md5s
GROUP BY DISTINCT md5;

从 Athena 输出的所有结果 .csv 仍然具有重复的 MD5。什么给了?


Athena 是否在执行部分重复数据删除? - 更奇怪的是,如果我在 Athena 中执行 COUNT(DISTINCT md5),我得到的计数与导出时返回的行数不同。

COUNT(DISTINCT md5) 在雅典娜:97,533,226 不同 MD5 的导出记录:97,581,616 结果导出中有 14,790 个重复项,因此 COUNT(DISTINCT) 计数都不好,结果导出也不好。

Athena 是否在导出时创建重复项? - 情节变厚了。如果我在 Athena 表中查询在 Athena 结果导出中重复的 MD5 之一,我只能从表中获得一个结果/行。我使用LIKE 查询对此进行了测试,以确保空格不会导致问题。这意味着 Athena 正在向导出添加重复项。结果中相同的 MD5 不会超过两个。

select
  md5,
  to_utf8(md5)
from md5s
where md5 like '%0061c3d72c2957f454eef9d4b05775d7%';

Athena 的计数和结果文件都错了吗? - 我使用 mysql 对这些相同的记录进行了重复数据删除,最终得到了 97,531,010 个唯一的 MD5。 Athenas 计数和结果详情如下。

COUNT(DISTINCT md5) 在雅典娜:97,533,226 不同 MD5 的导出记录:97,581,616 结果导出中有 14,790 个重复项,因此似乎两个 COUNT(DISTINCT) 计数都不好,结果导出也不好。

我认为这是一个 Athena 错误 - 我已向 AWS 的开发团队提交了一份工单以修复此问题,并会在修复后更新此帖子。

这是相关的 AWS 论坛帖子,其他用户也遇到了同样的问题。 https://forums.aws.amazon.com/thread.jspa?messageID=764702

【问题讨论】:

也许空白使看似相同的 md5 实际上不同? 我相信所有这些查询都是一样的。使用 EXPLAIN 查看查询计划。我猜也是空白。尝试添加 HAVING count(*) > 1 并输出 to_utf8(md5),这样就可以看到字符串的十六进制值了。 我认为这不是空格问题,我使用@DainSundstrom 的想法进行了测试。我在票的末尾添加了注释。很奇怪。其他想法? 【参考方案1】:

我已与 AWS 团队确认,在提出问题时,这是 AWS Athena 的一个已知错误。我不确定这是否已解决。

【讨论】:

【参考方案2】:

如有疑问,请使用 CTAS 删除任何重复项:

CREATE TABLE new_table
WITH (
      format = 'Parquet',
      parquet_compression = 'SNAPPY')
AS SELECT DISTINCT *
FROM old_table;

参考:https://docs.aws.amazon.com/athena/latest/ug/ctas-examples.html

【讨论】:

以上是关于AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?的主要内容,如果未能解决你的问题,请参考以下文章

Presto(AWS Athena)中 datefromparts 的替代方法是啥

AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?

Presto (AWS Athena) 中的拆分和搜索逗号分隔列

AWS DMS:如何处理 Presto/Athena 中的 TIMESTAMP_MICROS parquet 字段

AWS Athena [Presto] 如何仅接收过去 7 天的数据?

删除 Presto SQL 兼容数据库 (AWS Athena) 中数据中的双引号?