复制镶木地板文件,然后使用 Athena 查询它们

JPFrancoia

我使用 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.parquettable1->table2是差异)。

当您查询新表时,它不会在此位置查找,因为它不属于其任何分区的位置。

您可以通过多种方式解决此问题:

  • 也许您根本不需要分区,如果删除partition_cols=["date"]命令一部分会发生什么你还有分区表吗?(检查 Glue 控制台,或SHOW CREATE TABLE tableX在 Athena 中运行)。使用未分区的表,您可以将所需的任何数据移动到表的位置,Athena 会找到它。
  • 相反,移动数据,你可以从第一个表中添加分区到新表中,雅典娜运行是这样的:ALTER TABLE table2 ADD PARTITION ("date" = '20200317') LOCATION 's3://example/table1/date=20200317/'
  • 而是将分区添加到旧表,或两者兼而有之。这并不重要,仅取决于您在运行查询时要使用的名称。您还可以将手动设置的表作为主表,并将 Pandas 创建的表视为临时表。一旦 Pandas 创建了数据,您将其作为分区添加到主表并删除新创建的表。这样你就可以为你的表取一个好听的名字,并且名字中没有日期戳。
  • 如果你希望数据都在一个地方,你可以复制数据,然后像上面一样添加分区。
  • 有人可能会建议像上面一样复制数据,然后再运行MSCK REPAIR TABLE这是可行的,但是随着您获得更多分区,它会变得越来越慢,因此它不是一个可扩展的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Spark(pyspark)编写镶木地板文件?

无法使用Golang SDK在AWS Athena上执行查询

使用反射将pojo写入镶木地板文件

如何从Amazon Athena查询镶木地板数据?

如何使用ruby在Amazon Athena上执行查询?

AWS Athena地图查询

是否可以使用AWS Athena查询压缩文件?

对镶木地板数据进行AWS Athena查询以返回JSON输出

使用Lambda函数运行AWS Athena的查询

如何使用镶木地板文件源重命名AWS Athena列?

使用模板保存多个Athena查询

使用镶木地板工具打开镶木地板文件时出错

使用LIKE时,Amazon Athena中的全文查询超时

AWS Athena:使用带有数组的结构的属性查询

使用分区查询 Amazon Athena

使用 fastparquet 在子文件上划分镶木地板文件

将镶木地板文件转换为熊猫然后查询会出错

在 gcs 上使用镶木地板文件创建新的大查询外部表时。显示错误

Apache-Drill 查询镶木地板文件:镶木地板记录读取器出错

AWS Athena 查询分区

如何使用 Athena 在 EC2 中查询 JSON?

Snappy 压缩的 Avro 文件是否可以在 Athena 中查询?

使用 pyspark 迭代加载多个镶木地板文件

如何使用 Pyspark 并行处理多个镶木地板文件?

使用 Lambda 在 Athena 上运行大查询

使用通配符通过火花读取镶木地板文件

手动选择镶木地板分区与在 pyspark 中过滤它们

AWS Lambda 查询 Athena 并选择结果文件的名称

使用 Athena 查询访问日志时防止 SQL 注入