使用 Athena 读取 s3 中的 Parquet 文件
Reading Parquet files in s3 with Athena
目标是将多个 parquet 文件合并到一个 Athena table 以便我可以查询它们。
我从 csv 转换了两个 parquet 文件:
pandas.read_csv('a.csv').to_parquet('a.parquet', index=False)
pandas.read_csv('b.csv').to_parquet('b.parquet', index=False)
CSV 格式为 id,name,age
,例如:
1,john,20
2,mark,25
我将这些上传到 S3 存储桶:s3://my-test-bucket
,排列如下:
my-test-bucket
-> folder1
-> a.parquet
-> folder2
-> b.parquet
然后通过以下方式在 Athena 中创建 table:
CREATE EXTERNAL TABLE `my_table`(
`id` int,
`name` string,
`age` int
)
STORED AS PARQUET
LOCATION 's3://my-test-bucket'
tblproperties ("parquet.compress"="SNAPPY");
但是,当我尝试通过以下方式查询 table 时:
SELECT * FROM my_table;
我的 return 得到空行。有什么我想念的吗?
一种可能的解决方法是使用 AWS Data Wrangler:
import awswrangler as wr
path = 's3://my-test-bucket'
# Assume the data has been extracted in dict form from .csv
df = pd.DataFrame({
"id": [1, 2],
"name": ["John", "Jane"],
"age": [10, 11],
"folder": [1, 2]
})
wr.s3.to_parquet(
df=df,
path=path,
dataset=True,
mode="overwrite",
partition_cols=["folder"]
)
这将在 s3 中生成:
my-test-bucket
-> folder=1
-> <some hash>.parquet
-> folder=2
-> <some hash>.parquet
目标是将多个 parquet 文件合并到一个 Athena table 以便我可以查询它们。
我从 csv 转换了两个 parquet 文件:
pandas.read_csv('a.csv').to_parquet('a.parquet', index=False)
pandas.read_csv('b.csv').to_parquet('b.parquet', index=False)
CSV 格式为 id,name,age
,例如:
1,john,20
2,mark,25
我将这些上传到 S3 存储桶:s3://my-test-bucket
,排列如下:
my-test-bucket
-> folder1
-> a.parquet
-> folder2
-> b.parquet
然后通过以下方式在 Athena 中创建 table:
CREATE EXTERNAL TABLE `my_table`(
`id` int,
`name` string,
`age` int
)
STORED AS PARQUET
LOCATION 's3://my-test-bucket'
tblproperties ("parquet.compress"="SNAPPY");
但是,当我尝试通过以下方式查询 table 时:
SELECT * FROM my_table;
我的 return 得到空行。有什么我想念的吗?
一种可能的解决方法是使用 AWS Data Wrangler:
import awswrangler as wr
path = 's3://my-test-bucket'
# Assume the data has been extracted in dict form from .csv
df = pd.DataFrame({
"id": [1, 2],
"name": ["John", "Jane"],
"age": [10, 11],
"folder": [1, 2]
})
wr.s3.to_parquet(
df=df,
path=path,
dataset=True,
mode="overwrite",
partition_cols=["folder"]
)
这将在 s3 中生成:
my-test-bucket
-> folder=1
-> <some hash>.parquet
-> folder=2
-> <some hash>.parquet