hive hbase集成时间戳

时间:2013-05-07 13:37:43

标签: hadoop hbase hive

我想使用Hive(hive hbase集成)将表存储到HBase中 我的表包含字段类型TIMESTAMP(如DATE) 我做了一些研究,发现HBASE不支持TIMESTAMP,我该怎么办?

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating dat at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:80)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471) 
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762) 
at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:83) 
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471) 
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762) 
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:529) ... 9 more Caused by: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] 
at java.sql.Timestamp.valueOf(Timestamp.java:185) 
at org.apache.hadoop.hive.serde2.lazy.LazyTimestamp.init(LazyTimestamp.java:74) 
at org.apache.hadoop.hive.serde2.lazy.LazyStruct.uncheckedGetField(LazyStruct.java:219) 
at org.apache.hadoop.hive.serde2.lazy.LazyStruct.getField(LazyStruct.java:192) 
at org.apache.hadoop.hive.serde2.lazy.objectinspector.LazySimpleStructObjectInspector.getStructFieldData(LazySimpleStructObjectInspector.java:188) 
at org.apache.hadoop.hive.ql.exec.ExprNodeColumnEvaluator.evaluate(ExprNodeColumnEvaluator.java:98) 
at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:76)

1 个答案:

答案 0 :(得分:1)

最简单的方法是将TIMESTAMP转换为STRINGINTFLOAT。这会产生令人遗憾的副作用,即放弃Hive内置的TIMESTAMP支持。因此,你将失去

  • 阅读时间检查以确保您的列包含有效的TIMESTAMP
  • 透明地使用不同格式的TIMESTAMPS
  • 的能力
  • 使用在TIMESTAMP s。
  • 上运行的Hive UDF

如果您为自己的时间戳选择单一格式并坚持下去,那么前两个损失就会减轻。最后一次并不是一个巨大的损失,因为only two Hive date functions实际上在TIMESTAMP上运行。他们中的大多数都在STRING上运作。如果您非常需要from_utc_timestampfrom_utc_timestamp,则可以编写自己的UDF。

如果您使用STRING并且只需要日期,我会使用yyyy-mm-dd格式。如果您需要时间,请使用yyyy-mm-dd hh:mm:ssyyyy-mm-dd hh:mm:ss[.fffffffff],如果您需要部分第二时间戳。此格式也与Hive期望TIMESTAMP的方式一致,并且是大多数Hive日期函数所需的格式。

如果你使用INT,你又有两个选择。如果只有日期很重要,YYYYMMDD符合ISO 8601的“基本”格式(这是我个人使用过的表格,当我不需要执行任何日期操作时,这种格式很方便在列上)。如果时间也很重要,请使用YYYYMMDDhhmmss。这是日期时间ISO 8601基本形式的acceptable variant。如果您需要小数秒计时,请使用FLOAT和表格YYYYMMDDhhmmss.fffffffff。请注意,这些形式都不符合Hive期望整数或浮点TIMESTAMP的方式。

如果日历日期和时间的概念根本不重要,那么使用INT作为Unix时间戳可能是最简单的,如果你还需要小数秒,则使用FLOAT 。此表单与Hive期望TIMESTAMP的方式一致。