蜂巢时间戳不接受 Spark 时间戳类型

Posted

技术标签:

【中文标题】蜂巢时间戳不接受 Spark 时间戳类型【英文标题】:Spark timestamp type is not getting accepted with hive timestamp 【发布时间】:2018-03-28 17:51:06 【问题描述】:

我有一个火花数据框,其中包含一个字段作为时间戳。我将数据帧存储到创建 hive 外部表的 HDFS 位置。 Hive 表包含时间戳类型的字段。但是,从外部位置 hive 读取数据时,会将时间戳字段填充为表中的空白值。 我的火花数据框查询:

df.select($"ipAddress", $"clientIdentd", $"userId", to_timestamp(unix_timestamp($"dateTime", "dd/MMM/yyyy:HH:mm:ss Z").cast("timestamp")).as("dateTime"), $"method", $"endpoint", $"protocol", $"responseCode", $"contentSize", $"referrerURL", $"browserInfo")

Hive 创建表语句:

CREATE EXTERNAL TABLE `finalweblogs3`(
   `ipAddress` string,
   `clientIdentd` string,
   `userId` string,
   `dateTime` timestamp,
   `method` string,
   `endpoint` string,
   `protocol` string,
   `responseCode` string,
   `contentSize` string,
   `referrerURL` string,
   `browserInfo` string)
 ROW FORMAT SERDE
   'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
 WITH SERDEPROPERTIES (
   'field.delim'=',',
   'serialization.format'=',')
 STORED AS INPUTFORMAT
   'org.apache.hadoop.mapred.TextInputFormat'
 OUTPUTFORMAT
   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
   'hdfs://localhost:9000/streaming/spark/finalweblogs3'

我不明白为什么会这样。

【问题讨论】:

尝试删除 unix_timestamp 部分:to_timestamp($"dateTime", "dd/MMM/yyyy:HH:mm:ss Z").cast("timestamp").as("dateTime" ) 我还能知道原始时间戳是什么样子的吗? hive 只采用时间戳格式为 yyyy-mm-dd hh:mm:ss[.f...] 25/Oct/2011:01:41:00 -0500 这就是时间戳的样子。 你试过我在第一条评论中建议的那个吗? 是的,我已经尝试过,但在 Hive 中,它仍然被填充为空白值。 【参考方案1】:

我通过将存储格式更改为“Parquet”来解决它。 我仍然不知道为什么它不适用于 CSV 格式。

【讨论】:

以上是关于蜂巢时间戳不接受 Spark 时间戳类型的主要内容,如果未能解决你的问题,请参考以下文章

如何根据时间戳匹配值,当时间戳不存在时,该值是前一个时间戳的值

从具有时间戳的镶木地板蜂巢表中读取火花

Valgrind 内存泄漏报告中的时间戳不正确

在数据透视表中附加数据时时间戳不更新

bookshelf.js 时间戳不起作用

转换为 unix 时间戳不正确