我有一个对请求进行分类的 S3 表。它包含大量“小”行。每行代表一个请求,以及一些我喜欢用来过滤查询的小整数/标志。
每一行也有一个唯一的request_id。
除此之外,我还有另一个表,其中包含每个请求的扩展数据。该数据对于扫描+过滤方法来说太大了。示例:它包含有关请求执行的详细信息。如果我要触发此表的完整扫描(甚至部分扫描),它将必须读取太多数据。
我可以采用FOREIGN_KEYS的原始SQL方法,并通过request_id对我的第二个表进行分区吗?
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 读取付费?)
Athena 被设计为分析查询引擎,并经过优化以高效扫描大量数据。你不必太担心“它必须读取太多数据。”
如果您担心扫描成本,建议对数据使用压缩,例如 Parquet。
如果出于某种原因想要对数据使用分区,则可以使用更具可扩展性的分区选项,例如哈希函数并采用哈希码的前两个字符。它可以为您提供有限数量分区的平衡,
SELECT
SUBSTRING(MD5(request_id), 1, 2) AS hash_prefix
FROM
your_table_name;