Hive 从 csv 导入字符串日期为“yyyy-mm-dd HH:MM:SS”作为时间戳
Posted
技术标签:
【中文标题】Hive 从 csv 导入字符串日期为“yyyy-mm-dd HH:MM:SS”作为时间戳【英文标题】:Hive importing a string date given as "yyyy-mm-dd HH:MM:SS" from csv as timestamp 【发布时间】:2014-03-26 22:10:44 【问题描述】:我的 csv 文件如下所示:
"SMTEX","GSN","KOF",1.71,"2014-01-06 13:32:21"
"NXEX","JS","FIM",1.99,"2014-01-14 09:52:11"
"SMTEX","WT","VUX",0.82,"2014-01-23 02:22:37"
我通过以下方式将这些数据导入 hive:
hive -e 'CREATE TABLE playground.stuff (
ex_id STRING,
game_id STRING,
user_id STRING,
price FLOAT,
date TIMESTAMP) ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";'
hive -e 'LOAD DATA LOCAL INPATH "/path/to/csv" INTO TABLE playground.stuff;'
但是时间戳似乎没有被解析。我得到的输出是:
hive> select * from stuff;
OK
"SMTEX" "GSN" "KOF" 1.71 NULL
"NXEX" "JS" "FIM" 1.99 NULL
"SMTEX" "WT" "VUX" 0.82 NULL
我做错了什么?
【问题讨论】:
【参考方案1】:我怀疑是双引号。格式应为 yyyy-mm-dd hh:mm:ss 而不是“yyyy-mm-dd hh:mm:ss”。您会注意到双引号也出现在字符串字段中。
根据评论编辑答案:
Hive 本身不支持双引号,但是有一个 csv serde 可以为您执行此操作:https://github.com/ogrodnek/csv-serde
【讨论】:
是的,没错。省略引号时,我实际上能够导入时间戳。但是,我想知道是否有可能明确告诉 hive 如何理解格式。【参考方案2】:Github上有一个jar(https://github.com/ogrodnek/csv-serde) csv-serde-1.1.2-0.11.0-all.jar。下载它并在命令提示符下运行 Hive 查询时添加 jar。
(摘自上述Github链接)
添加jar路径/to/csv-serde.jar;
创建表 my_table(a string, b string, ...) 行格式 serde 'com.bizo.hive.serde.csv.CSVSerde' 存储为文本文件 ;
这用引用的值解决了我的问题。
如果您使用 Hue 将引用的 csv 数据上传到 Hive,请按照以下视频进行操作。 http://gethue.com/hadoop-tutorial-create-hive-tables-with-headers-and/
【讨论】:
【参考方案3】:鉴于本文标题中的格式化字符串,请注意日期/时间格式的通用大小写在使用库解析函数时非常重要。
MM 代表月份,而 mm 代表分钟;不要混淆。
HH 表示 24 小时表示法与 hh 表示 12 小时表示法是另一个可能很重要的例子。
【讨论】:
以上是关于Hive 从 csv 导入字符串日期为“yyyy-mm-dd HH:MM:SS”作为时间戳的主要内容,如果未能解决你的问题,请参考以下文章