amazon-web-services - 使用 AWS Athena 在 AWS Glue 中复制表
问题描述
我在 AWS Glue 中有一个表,它使用 S3 存储桶作为数据位置。我想对该现有表执行 Athena 查询,并使用查询结果创建一个新的 Glue 表。
我尝试创建一个新的 Glue 表,将其指向 S3 中的新位置,并将 Athena 查询结果通过管道传输到该 S3 位置。这几乎完成了我想要的,但是
- 一个 .csv.metadata 文件与实际的 .csv 输出(由 Glue 表在读取指定 s3 位置中的所有文件时读取)一起放置在此位置。
- csv 文件在每个字段周围放置双引号,这会破坏 Glue 表中定义的使用数字的任何 fieldSchema
这些服务都是为了协同工作而设计的,因此必须有适当的方法来实现这一点。任何建议将不胜感激:)
解决方案
这样做的方法是使用CTAS 查询语句。
(CTAS) 查询根据
CREATE TABLE AS SELECT
来自另一个查询的 SELECT 语句的结果在 Athena 中创建一个新表。Athena 将 CTAS 语句创建的数据文件存储在 Amazon S3 中的指定位置。
例如:
CREATE TABLE new_table
WITH (
external_location = 's3://my_athena_results/new_table_files/'
) AS (
-- Here goes your normal query
SELECT
*
FROM
old_table;
)
虽然有一些限制。但是,对于您的情况,最重要的是:
- 在 Amazon S3 中存储 CTAS 查询结果的目标位置必须为空。
- 这同样适用于新表的名称,即它不应该存在于 AWS Glue 数据目录中。
- 通常,您无法明确控制 CTAS 查询将创建多少文件,因为 Athena 是一个分布式系统。但是,可以尝试使用“此解决方法” ,它在子句
中使用
bucketed_by
和bucket_count
字段WITH
CREATE TABLE new_table WITH ( external_location = 's3://my_athena_results/new_table_files/', bucketed_by=ARRAY['some_column_from_select'], bucket_count=1 ) AS ( -- Here goes your normal query SELECT * FROM old_table; )
除了创建新文件和定义与您关联的表外,还可以将数据转换为不同的文件格式,例如 Parquet、JSON 等。
推荐阅读
- testing - 在 Flutter 测试中关闭对话框的正确方法
- python - 将代码修改为默认选项而不是要求用户选择?
- java - 在编译时和运行时绑定变量
- ios - 如何在 iOS 上使用 react native 自动填充信用卡?
- php - 我的 laravel 项目中的 Http 链接显示问题
- python - 如何在python中获取函数的返回值
- opengl - 影响 HarfBuzz 的 GLFW 窗口创建选项
- python - 基于匹配两个不同列值的 Pandas if 语句
- arrays - 是否使用附加数组对“合法”进行排序?
- javascript - 在提交之前使用 JS 单击自定义下订单按钮验证结帐字段