我必须选择超过19 亿行。我正在尝试在 AWS ATHENA 控制台中查询数据库中托管的表。该表正在从 S3 存储桶读取镶木地板文件。
当我运行此查询时:
SELECT * FROM ids WHERE org = 'abcd' AND idkey = 'email-md5';
我的查询似乎超时了,因为当我对其运行 COUNT 时会返回 19 亿行。
我尝试OFFSET
和LIMIT
但它似乎在 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';
如上所述,返回的计数是 19 亿。我需要拉取所有 19 亿行,以便我可以下载它并进行进一步分析。
看来您的情况是:
- 每日 ETL 过程每天提供新的 Parquet 文件
- 一个表有 19 亿行
- 雅典娜中的查询超时
看来您的问题与雅典娜必须查询如此多的数据有关。提高雅典娜效率(和成本(的一些方法是:
- 使用列格式的文件(您正在使用 Parquet,所以这很棒!
- 压缩文件(从磁盘读取更少意味着查询速度更快,成本更低(
- 对文件进行分区(这允许雅典娜完全跳过不相关的文件(
对于您的情况,最简单的方法可能是开始对数据进行分区,方法是根据通常包含在WHERE
语句中的内容将每日文件放入单独的目录中。这通常是日期,很容易分区(例如每天或每月不同的目录(,但鉴于您对org
和idkey
的过滤,可能无关紧要。
另一种选择是将传入文件转换为包含相关数据的新表。例如,您可以创建一个包含行摘要的表,例如包含org
、idkey
和这些行count
的表。因此,文件中的多行将减少为一行。这需要更好地了解文件的内容以及您打算如何查询,但它会优化这些查询。基本上,您将每天的新文件处理到计算表中,然后针对计算表而不是原始数据运行查询。(通常称为 ETL 过程。
最后一个建议是将数据导入 Amazon Redshift。它可以轻松处理数十亿行,并且可以以压缩、优化的方式存储数据。仅当对数据运行大量查询时,这才有用。如果您每天只运行几个查询,那么雅典娜将是更好的选择。