问题描述
我想知道 AWS Athena 中是否有一种方法可以仅利用 parquet 的柱状模型将 2 个 parquet 文件“合并”到 Athena 中的一个表中,这意味着无需进行任何连接或后处理?
例如:
文件 1:
id | 名字 |
---|---|
1 | 约翰 |
2 | 乔 |
文件 2:
id | 姓氏 | 状态 |
---|---|---|
1 | 能源部 | 1 |
2 | 史密斯 | 0 |
雅典娜决赛桌结果:
id | 名字 | 姓氏 | 状态 |
---|---|---|---|
1 | 乔恩 | 能源部 | 1 |
2 | 乔 | 史密斯 | 0 |
我知道我可以在两个文件中进行连接,但我想知道因为我使用的是 Parquet 可以在没有用于连接的 sql 命令的情况下实现吗?
谢谢!
解决方法
Athena 基本上只是 Presto/Trino 的修改版本,它是一个通过 Hive(或类似 Glue/Iceberg)的纯 SQL 接口。除了拥有读取器之外,它并不真正关心底层存储是什么。所以,这是值得怀疑的。它需要扫描每个文件并加入键,因为它以类似方式处理 parquet、orc、csv 等。
Parquet 也是一种非常复杂的格式。即使这两个文件具有相同的列,它们也可以在内部布局或以非常不同的方式排序。这不像它们都是一个简单的排序 CSV,您可以“在第 12 行从两个文件中抓取并合并所有内容”或类似的东西。
所以,我怀疑你会在 Athena/presto 或外面找到这样的东西。听起来不太可行。无论如何,这样做基本上都必须进行连接,即使您没有这样称呼它。
,您可以直接在 python 中使用 parquet 文件来完成:
import pyarrow.parquet as pq
df_1 = pq.read_table("file1.pq").to_pandas()
df_2 = pq.read_table("file2.pq").to_pandas()
joined_df = df_1.merge(df_2,left_on='id',right_on='id',how='inner')
joined_df.to_parquet('file3.pq')
但我会注意其他答案中提到的所有危险信号。