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”作为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

c#字符串日期格式从d.M.yyyy到yyyy-MM-dd

Hive 未检测到时间戳格式

CSV 日期格式转 MySQL 日期格式

当str的格式为dd/mm/yyyy时,如何将列类型从str转换为日期?

带有时间的日期字符串的 TextToColumns

在 Hive 中将字符串转换为日期/时间戳