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