AWS雅典娜查询输出格式



我有包含CSV文件的S3存储桶(请参阅'数据示例')。

文件是由于achena查询而创建的。

我想将"时间"列视为十进制(17,7)和"大小"列为bigint。

我定义了一个表(请参阅"表定义")并使用查询(请参见下面的"查询")我在下面得到"错误"。

我的问题是
有没有一种方法可以控制雅典娜查询输出格式并获得无引号的CSV?(1545980216.9581780,1349 vs" 1545980216.9581780"," 1349")

假设上一个问题的答案是负面的。我如何查询表" del_me_later_4"中的数据并将字段视为十进制和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)

我找到了一个解决方案。我使用org.apache.hadoop.hive.serde2.opencsvserde。

当您将Athena与OpenCsvSerde一起使用时,Serde将所有列类型转换为字符串。接下来,雅典娜(Athena)中的解析器根据其发现将值从字符串中解析为实际类型。例如,当它可以辨别出值时,它将值解析为布尔,bigint,int和双数据类型。如果值以UNIX格式的时间戳为时间戳,则雅典娜将其解析为时间戳。如果这些值以蜂巢格式的时间戳为hive,则雅典娜将其解析为int。日期类型值也被解析为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'  
)

最新更新