[英]AWS Athena query output format
我有包含 csv 文件的 S3 存儲桶(請參閱“數據示例”)。
這些文件是 Athena 查詢的結果。
我想將“時間”列視為十進制(17,7),將“大小”列視為 bigint。
我定義了一個表(參見“表定義”)並使用查詢(參見下面的“查詢”)我得到下面的“錯誤”。
我的問題是:
有沒有辦法控制 Athena 查詢輸出格式並獲得一個沒有字段周圍引號的 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 會將所有列類型轉換為 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'
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.