amazon-web-services - AWS Athena 查询输出格式
问题描述
我有包含 csv 文件的 S3 存储桶(请参阅“数据示例”)。
这些文件是作为 Athena 查询的结果创建的。
我想将“时间”列视为小数(17,7),将“大小”列视为 bigint。
我定义了一个表(参见“表定义”)并使用查询(参见下面的“查询”)我得到了下面的“错误”。
我的问题是:
有没有办法控制 Athena 查询输出格式并获得一个没有字段引号的 csv?(1545980216.9581780,1349 与“1545980216.9581780”、“1349”)
假设上一个问题的答案是否定的。如何查询表“del_me_later_4”中的数据并将字段视为十进制和大整数。
数据样本
"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'
)
推荐阅读
- python - html 中的 Pandas 数据分析
- google-apps-script - 如何按名称搜索共享云端硬盘
- docker - Azure 逻辑应用 ACI 连接器 - BackOff 状态
- google-bigquery - Google BigQuery:如何查询两个不同值之间的共享值计数?
- javascript - Firestore 查询没有为异步等待返回正确的值?
- android - 本机库上的 AdvertisingId
- commercetools - 为什么默认送货方式不适用于购物车?
- .net - 从 DMZ 到 LAN 的通信
- spring - 从资源/模板_and_字符串中解析模板
- java - IronSource 中介广告在上传到 Playstore 后停止工作