【问题标题】:Duplicate Table in AWS Glue using AWS Athena使用 AWS Athena 在 AWS Glue 中复制表
【发布时间】:2019-07-21 09:50:39
【问题描述】:
我在 AWS Glue 中有一个表,它使用 S3 存储桶作为数据位置。我想对该现有表执行 Athena 查询,并使用查询结果创建一个新的 Glue 表。
我尝试创建一个新的 Glue 表,将其指向 S3 中的一个新位置,并将 Athena 查询结果通过管道传输到该 S3 位置。这几乎完成了我想要的,但是
- .csv.metadata 文件与实际的 .csv 输出(由 Glue 表在读取指定 s3 位置中的所有文件时读取)一起放置在此位置。
- csv 文件在每个字段周围放置双引号,这会破坏 Glue 表中定义的使用数字的任何 fieldSchema
这些服务都是为了协同工作而设计的,因此必须有适当的方法来实现这一点。任何建议将不胜感激:)
【问题讨论】:
标签:
amazon-web-services
amazon-s3
aws-sdk
amazon-athena
aws-glue
【解决方案1】:
方法是使用CTAS query statements。
CREATE TABLE AS SELECT (CTAS) 查询根据来自另一个查询的 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;
)
虽然有some limitations。但是,对于您的情况,最重要的是:
- 在 Amazon S3 中存储 CTAS 查询结果的目标位置必须为空。
- 这同样适用于新表的名称,即它不应该存在于 AWS Glue 数据目录中。
- 通常,由于 Athena 是一个分布式系统,因此您无法明确控制 CTAS 查询将创建多少文件。
但是,可以尝试使用"this workaround",它使用
WITH 子句中的bucketed_by 和bucket_count 字段
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 等。
【解决方案2】:
我猜你必须改变你的ser-de。如果您要查询 csv 数据,opencsvserde 或lazysimple serde 应该适合您。