代码之家  ›  专栏  ›  技术社区  ›  balderman

AWS雅典娜查询输出格式

  •  0
  • balderman  · 技术社区  · 6 年前

    这些文件是雅典娜查询的结果。

    我定义一个表(见“表定义”)并使用查询(见下面的“查询”) 我得到下面的“错误”。

    我的问题是
    有没有一种方法可以控制雅典娜查询的输出格式,得到一个没有引号的csv?(1545980216.95817801349对“1545980216.9581780”,“1349”)

    假设上一个问题的答案是否定的。如何查询“del\u me\u later\u 4”表中的数据并将字段视为decimal和bigint。

    数据样本

    "time","size"
    "1545751457.8957720","432"
    "1545751458.0753407","583"
    "1545751458.1407920","583"
    "1545751458.1683733","560"
    

    表定义

    CREATE EXTERNAL TABLE `del_me_later_4`(
      `time` string, 
      `size` string)
    ROW FORMAT DELIMITED 
      FIELDS TERMINATED BY ',' 
    STORED AS INPUTFORMAT 
      'org.apache.hadoop.mapred.TextInputFormat' 
    OUTPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION
      's3://del-me-later/'
    TBLPROPERTIES (
      'skip.header.line.count'='1'  
    )
    

    查询

    SELECT cast(time AS decimal(17,7)) as time,
           cast(size AS bigint) as size  
    FROM "del_me_later_4"
    

    INVALID_CAST_ARGUMENT: Cannot cast VARCHAR '"1545751457.8957720"' to DECIMAL(17, 7)
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   balderman    6 年前

    我找到了解决办法。我用org.apache.hadoop下载.蜂巢.serde2.OpenCSVSerde。

    在OpenCSVSerde中使用Athena时,SerDe会将所有列类型转换为字符串。接下来,Athena中的解析器将字符串中的值解析为实际类型。例如,它可以将值解析为BOOLEAN、BIGINT、INT和DOUBLE数据类型。如果这些值是UNIX格式的TIMESTAMP,那么Athena将它们解析为TIMESTAMP。如果值是Hive格式的TIMESTAMP,那么Athena将它们解析为INT。DATE类型的值也将解析为INT。

    https://docs.aws.amazon.com/athena/latest/ug/csv.html

    ''' CREATE EXTERNAL TABLE `{}`(
      `time` string, 
      `size` string)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
      "separatorChar" = ","
    )
    LOCATION
      's3://{}/{}'
    TBLPROPERTIES (
      'skip.header.line.count'='1'  
    )