Athena 连接和高基数分区

问题描述 投票:0回答:1

我有一个对请求进行分类的 S3 表。它包含大量“小”行。每行代表一个请求,以及一些我喜欢用来过滤查询的小整数/标志。

每一行也有一个唯一的request_id。

除此之外,我还有另一个表,其中包含每个请求的扩展数据。该数据对于扫描+过滤方法来说太大了。示例:它包含有关请求执行的详细信息。如果我要触发此表的完整扫描(甚至部分扫描),它将必须读取太多数据。

我可以采用FOREIGN_KEYS的原始SQL方法,并通过request_id对我的第二个表进行分区吗?

  • 这是否可以避免对扩展表进行扫描+过滤:仅读取我在第一个表中过滤的 request_ids?
  • 在第二张表上进行如此高基数的分区有什么问题吗?
    • 每个 S3 分区只有一行
    • 我永远不会扫描第二张桌子

big_table
S3 分区将类似于:
s3://my_bucket/big_table/request_id=1234/data.json

sql 查询将类似于:

SELECT FROM "small_table".request_id,"big_table".very_long_error_message
WHERE "small_table".date='2023-NOV-20', "small_table".error=true, 
      "small_table".request_id = "big_table".request_id

这里会发生什么? Athena 只会读取“big_table”中加入的行吗?还是会根据

request_id
进行扫描和过滤? (我要为多少个 big_table 读取付费?)

sql amazon-athena
1个回答
0
投票

Athena 被设计为分析查询引擎,并经过优化以高效扫描大量数据。你不必太担心“它必须读取太多数据。”

如果您担心扫描成本,建议对数据使用压缩,例如 Parquet。

如果出于某种原因想要对数据使用分区,则可以使用更具可扩展性的分区选项,例如哈希函数并采用哈希码的前两个字符。它可以为您提供有限数量分区的平衡,

SELECT
  SUBSTRING(MD5(request_id), 1, 2) AS hash_prefix
FROM
  your_table_name;

© www.soinside.com 2019 - 2024. All rights reserved.