簡體   English   中英

AWS Athena 查詢輸出格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM