在 Athena 中加入具有不同列但公共键id列的 2 个镶木地板文件

问题描述

我想知道 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')

但我会注意其他答案中提到的所有危险信号。