【问题标题】:Load Athena output into Athena table将 Athena 输出加载到 Athena 表中
【发布时间】:2018-09-21 08:13:06
【问题描述】:

我使用 Athena 查询一个表,得到的输出文件为 CSV,如下所示:

"col_a_string","col_b_string","col_c_timestamp","col_d_int"

现在,我想获取 csv 文件并将其加载到另一个 Athena 表中,这样我就可以检查我的数据并使用它 - 但是当我使用 FIELDS TERMINATED BY ',' 定义我的表时,值会保留括号并考虑所有字段字符串(什么给了我时间戳和 int 列的空白列)。

Athena 无法读取 Athena 输出有点荒谬... 如何定义我的表格以便它可以忽略括号?

谢谢!

【问题讨论】:

标签: amazon-web-services hive amazon-athena


【解决方案1】:

现在看起来这是一个功能: https://docs.aws.amazon.com/athena/latest/ug/ctas.html

CREATE TABLE AS SELECT (CTAS) 查询在 Athena 中创建一个新表 来自另一个查询的 SELECT 语句的结果。雅典娜 将 CTAS 语句创建的数据文件存储在指定的 Amazon S3 中的位置。有关语法,请参阅 CREATE TABLE AS。

使用 CTAS 查询:

从查询结果中一步创建表,无需重复 查询原始数据集。这使得处理原始数据变得更容易 套。

将查询结果转换为其他存储格式,如 Parquet 和兽人。这提高了查询性能并降低了查询成本 雅典娜。有关信息,请参阅列存储格式。

创建仅包含您需要的数据的现有表的副本。

【讨论】:

    【解决方案2】:

    试试这个:

    CREATE EXTERNAL TABLE IF NOT EXISTS my_table (
      `col_a_string` String,
      `col_b_string` String,
      `col_c_timestamp` TIMESTAMP, 
      `col_d_int ` Int,       
    )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
       "separatorChar" = ",",
       "quoteChar"     = "\""
    ) LOCATION 's3://your-s3-location'
    TBLPROPERTIES ("skip.header.line.count"="1")
    

    这对你有用吗?注意序列化/反序列化属性中的quotechar 属性。

    【讨论】:

    • 使用 openCSVSerde 创建表语句中的所有列类型都需要列为字符串。来自文档:当您将 Athena 与 OpenCSVSerde 一起使用时,SerDe 会将所有列类型转换为 STRING。接下来,Athena 中的解析器根据它找到的内容将 STRING 中的值解析为实际类型。例如,当它可以识别它们时,它会将值解析为 BOOLEAN、BIGINT、INT 和 DOUBLE 数据类型。如果值是 UNIX 格式的 TIMESTAMP,Athena 会将它们解析为 TIMESTAMP。如果值在 Hive 格式的 TIMESTAMP 中,则 Athena 将它们解析为 INT。 DATE 类型值也被解析为 INT。
    • 要进一步将表中的列转换为所需的类型,您可以在表上创建一个视图并使用 CAST 转换为所需的类型。
    【解决方案3】:

    这就是我通常从 csv 加载数据的方式。

    CREATE EXTERNAL TABLE IF NOT EXISTS my_table(
     `col_a_string` String,
     `col_b_string` String,
     `col_c_timestamp` TIMESTAMP, 
     `col_d_int ` Int)  
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES ( 
     'separatorChar' = ',', 
     'quoteChar' = '\"', 
     'escapeChar' = '\\' )
    STORED AS TEXTFILE 
    LOCATION '<s3://filepath>'
    TBLPROPERTIES ('has_encrypted_data'='false',
              "skip.header.line.count"="1");
    

    这样做的好处是即使某些列有双引号,它也会正确解析和加载

    例如。 col_a_string,"col_b_string",col_c_timestamp,"col_d_int"

    【讨论】:

      【解决方案4】:

      试试这个,对我有用

      CREATE EXTERNAL TABLE `my_table`(
        col_a_string` String,
       `col_b_string` String,
       `col_c_timestamp` TIMESTAMP, 
       `col_d_int ` Int)
      ROW FORMAT SERDE 
        'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
      WITH SERDEPROPERTIES ( 
        'escapeChar'='\\', 
        'separatorChar'=',') 
      STORED AS INPUTFORMAT 
        'org.apache.hadoop.mapred.TextInputFormat' 
      OUTPUTFORMAT 
        'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
      LOCATION
        's3://<path>'
      TBLPROPERTIES (
        'skip.header.line.count'='1')
      

      【讨论】:

        猜你喜欢
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-22
        • 2023-02-14
        • 2021-12-22
        相关资源
        最近更新 更多