我使用 aws-data-wrangler ( https://github.com/awslabs/aws-data-wrangler ) 来处理 Pandas 数据帧。一旦它们被处理,我将它们导出到镶木地板文件:
wr.pandas.to_parquet(
dataframe=my_dataframe,
description=DESCRIPTION,
columns_comments=COLUMN_COMMENTS,
parameters=DATASET_TAGS,
database=my_database,
table=f"{table}_{latest_refresh_date}",
path=f"s3://{bucket_out}/{sub_path}/{latest_refresh_date}/",
procs_cpu_bound=1,
partition_cols=["date"],
mode="overwrite_partitions",
preserve_index=False,
)
通过这样做,它还创建了一个 Glue 表。Parquet 文件愉快地存在于 S3 存储桶中,我可以使用 Athena 使用 Glue 表的名称查询数据,如下所示:
select * from {table}_{latest_refresh_date}
现在假设我获得了新数据。新数据应存储在新的 S3 路径中:s3://{bucket_out}/{sub_path}/{other_refresh_date}/
例如。我像以前一样处理新数据,但我不想重新处理旧数据。因此,我使用简单的 S3 副本将 Parquet 文件从旧路径复制到新路径。旧数据不使用wr.pandas.to_parquet
.
现在,当我想查询居住在 中的数据时s3://{bucket_out}/{sub_path}/{other_refresh_date}/
,我只能访问新数据。
select * from {table}_{other_refresh_date}
看来我只能查询添加到Glue表中的数据。我天真地认为 Athena 会查询 S3 路径,但显然它比这更复杂。
您能否向我解释为什么会发生这种情况,并提出解决办法?我是否需要以某种方式将旧文件注册到新的 Athena 表?
在不知道 Pandas 在幕后所做的事情的细节的情况下,我怀疑问题在于它正在创建一个分区表(如partition_cols=["date"]
命令的一部分所建议的那样)。分区表不仅有一个位置,而且每个分区有一个位置。
这可能是什么要去:当你创建你的S3数据看起来像这样结束了第一个表:s3://example/table1/date=20200317/file.parquet
和分区表与位置的分区s3://example/table1/date=20200317/
。桌子也可能有一个位置,它可能是s3://example/table1/
,但这主要是没有意义的——它不用于任何事情,只是 Glue 要求桌子有一个位置。
当您创建下一个表时,您会在 say 中获取数据s3://example/table2/date=20200318/file.parquet
,以及一个具有相应分区的表。我假设您接下来要做的是将数据从第一个表复制到s3://example/table2/date=20200317/file.parquet
(table1
->table2
是差异)。
当您查询新表时,它不会在此位置查找,因为它不属于其任何分区的位置。
您可以通过多种方式解决此问题:
partition_cols=["date"]
命令的一部分会发生什么?你还有分区表吗?(检查 Glue 控制台,或SHOW CREATE TABLE tableX
在 Athena 中运行)。使用未分区的表,您可以将所需的任何数据移动到表的位置,Athena 会找到它。ALTER TABLE table2 ADD PARTITION ("date" = '20200317') LOCATION 's3://example/table1/date=20200317/'
。MSCK REPAIR TABLE
。这是可行的,但是随着您获得更多分区,它会变得越来越慢,因此它不是一个可扩展的解决方案。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句