使用AWS Athena的AWS Glue中的重复表

时间:2019-02-27 15:54:58

标签: amazon-web-services amazon-s3 aws-sdk amazon-athena aws-glue

我在AWS Glue中有一个表,该表使用S3存储桶作为数据位置。我想在该现有表上执行Athena查询,并使用查询结果创建一个新的Glue表。

我尝试创建一个新的Glue表,将其指向S3中的新位置,然后将Athena查询结果传递到该S3位置。这几乎可以完成我想要的,但是

  1. .csv.metadata文件与实际的.csv输出一起放置在此位置(由Glue表读取,因为它读取指定s3位置中的所有文件)。
  2. csv文件在每个字段周围加上双引号,这会破坏在使用数字的胶水表中定义的任何fieldSchema

这些服务都是为了协同工作而设计的,因此必须有一种适当的方法来实现此目的。任何建议将不胜感激:)

2 个答案:

答案 0 :(得分:1)

执行此操作的方法是使用CTAS query statements

  

一个CREATE TABLE AS SELECT(CTAS)查询根据另一个查询的SELECT语句的结果在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。但是,对于您而言,最重要的是:

  1. 用于在Amazon S3中存储CTAS查询结果的目标位置必须为空。
  2. 新表的名称也是如此,即它不应存在于AWS Glue数据目录中。
  3. 通常,由于Athena是分布式系统,因此您无法明确控制要通过CTAS查询创建多少个文件。 但是,可以尝试使用"this workaround",它使用bucketed_by子句中的bucket_countWITH字段
    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;
    )
    

除了创建新文件并定义与您相关联的表外,还可以将数据转换为其他文件格式,例如实木复合地板,JSON等

答案 1 :(得分:0)

我想您必须更改您的服务。如果要查询csv数据,则opencsvserde或lazysimple serde都可以为您工作。