【问题标题】:How to query Athena string to date in hadoop.hive.serde2.OpenCSVSerde format如何以 hadoop.hive.serde2.OpenCSVSerde 格式查询 Athena 字符串的日期
【发布时间】:2017-09-08 12:42:11
【问题描述】:

您好,我在 AWS Athena 中创建了以下架构以从 AWS S3 读取 csv 文件

CREATE EXTERNAL TABLE IF NOT EXISTS axlargetable.mine (
  createdate string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '\"',
   'escapeChar' = '\\'
   ) 
LOCATION 's3://ax-large-table/test/'
TBLPROPERTIES ('has_encrypted_data'='false')

“createdate”列包含以下值

7/01/2017 5:40:05 PM
7/03/2017 5:40:05 PM
7/04/2017 5:40:05 PM
7/05/2017 5:40:05 PM
7/06/2017 5:40:05 PM
7/31/2017 5:40:05 PM
7/31/2017 5:40:05 PM
7/31/2017 5:40:05 PM
7/31/2017 5:40:05 PM

如何以日期格式查询“createdate”列值?示例查询,如

Select * from axlargetable.mine 
where createdate between '7/03/2017' and '7/31/2017'

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-athena


    【解决方案1】:

    恐怕 OpenCSVSerDe 不支持解析具有某些非 ISO 格式的 date 类型。避免这种行为的唯一方法是将字符串转换为查询中的日期。

    在这种情况下,您需要使用parse_date 函数。

    select * from axlargetable.mine
    where date_parse(createdate, '%m/%d/%Y %h:%i:%s %p') 
              between DATE'2017-03-07' and DATE'2017-07-31';
    

    【讨论】:

    • 嗨 Jens 谢谢你的回答,我得到了价值,但我对这里的日期结构有点困惑,即 '2017-03-07' 'yyyy-mm-dd' 或 'yyyy -dd-mm',
    • 对不起,我得到了答案,非常感谢您的帮助
    • 是的,复制/粘贴错误,抱歉。应该是 2017-07-03,意思是 'yyyy-mm-dd'。
    • 我能再请你一个忙吗,如果我想包括时间,代码是什么。谢谢
    • 如果你坚持使用 ISO 格式,你可以只使用 TIMESTAMP 类型,否则再次使用 parse_date。 “在 TIMESTAMP'2017-07-03 18:03:02' 和 date_parse('7/06/2017 5:40:08 PM', '%m/%d/%Y %h:%i:%s % p')"
    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多