PrestoDB/AWS Athena- 分块检索大 SELECT

PrestoDB/AWS Athena- Retrieve a large SELECT by chunks

我必须 select 超过 19 亿行 。我正在尝试查询 AWS ATHENA 控制台中数据库中托管的 table。 table 正在从 S3 存储桶中读取 parquet 文件。

当我运行这个查询时:

SELECT * FROM ids WHERE org = 'abcd' AND idkey = 'email-md5';

我的查询似乎超时,因为当我 运行 对其进行 COUNT 时返回了 19 亿行。

我尝试了 OFFSETLIMIT,但它似乎在 AWS Athena 中不起作用。

也尝试了一些在线的东西

SELECT * FROM ids WHERE org = 'abcd' AND idkey = 'email-md5' LIMIT 0,500;

这似乎不太奏效。

不确定如何使用 SELECT 对如此大的数据集进行分块?

这里的目的是能够在查询超时的情况下查询整个数据集。

我 运行 计数-

SELECT COUNT(*) FROM ids WHERE org = 'abcd' AND idkey = 'email-md5';

如上所述,返回的 COUNT 为 19 亿。我需要提取所有 19 亿行,以便我可以下载它并进行进一步分析。

看来您的情况是:

  • 每日 ETL 过程每天提供新的 Parquet 文件
  • 一个table有19亿行
  • Athena 中的查询超时

看来您的问题与 Athena 必须查询如此多的数据有关。提高 Athena 效率(和成本)的一些方法是:

  • 使用柱状格式文件(您使用的是 Parquet,太棒了!)
  • 压缩文件(从磁盘读取更少意味着它更快并且查询成本更低)
  • 对文件进行分区(这允许 Athena 完全跳过不相关的文件)

对于您的情况,最简单的方法可能是开始对数据进行分区,方法是根据通常包含在 [=10= 中的内容将日常文件放入单独的目录中] 陈述。这通常是日期,这很容易分区(例如,每天或每月不同的目录),但考虑到您对 orgidkey.

的过滤可能不相关

另一种选择是将传入的文件转换为具有相关数据的新table。例如,您可以创建一个包含行摘要的 table,例如包含 orgidkey 和这些行的 count 的 table .因此,文件中的多行将减少为单行。这需要更好地了解文件的内容以及您打算如何查询,但它会优化这些查询。基本上,您会将每天的新文件处理到计算的 table 中,然后对计算的 table 而不是原始数据进行 运行 查询。 (通常称为 ETL 过程。)

最后一个建议是将数据导入 Amazon Redshift。它可以很容易地处理数十亿行,并可以压缩、优化的方式存储数据。这仅在您 运行 对数据进行大量查询时才有用。如果您每天只 运行 几次查询,那么 Athena 会是更好的选择。