我有包含csv文件的S3存储桶(请参见“数据示例”)。
文件是通过Athena查询创建的。
我想将“时间”列视为小数(17,7),将“大小”列视为bigint。
我定义一个表(请参阅“表定义”)并使用查询(请参见下面的“查询”) 我在下面看到“错误”。
我的问题:
有没有一种方法可以控制Athena查询输出格式并获得不带字段引号的csv? (1545980216.9581780,1349对“ 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)
答案 0 :(得分:1)
我找到了解决方案。我使用org.apache.hadoop.hive.serde2.OpenCSVSerde。
当您将Athena与OpenCSVSerde一起使用时,SerDe会将所有列类型转换为STRING。接下来,Athena中的解析器根据找到的内容将STRING中的值解析为实际类型。例如,当可以辨别它们时,它将这些值解析为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'
)