1

我想使用 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)
4

1 回答 1

1

最简单的方法是将 转换TIMESTAMPSTRING,INTFLOAT. TIMESTAMP这将产生放弃 Hive 内置支持的不幸副作用。因此,您将失去

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

如果您为自己的时间戳选择单一格式并坚持使用,则可以减轻前两个损失。最后一个损失并不大,因为实际上只有两个 Hive 日期函数TIMESTAMPs 上运行。它们中的大多数都在STRINGs 上运行。如果您绝对需要from_utc_timestampand from_utc_timestamp,您可以编写自己的 UDF。

如果你STRING只需要日期,我会选择一种yyyy-mm-dd格式。如果您也需要时间yyyy-mm-dd hh:mm:ss,或者yyyy-mm-dd hh:mm:ss[.fffffffff]如果您需要部分秒时间戳。这种格式也与 Hive 期望TIMESTAMPs 的方式一致,并且是大多数 Hive 日期函数所需的形式。

如果你INT再次与你有几个选择。如果只有日期很重要,则YYYYMMDD符合ISO 8601的“基本”格式(这是我个人使用的一种格式,当我不需要对列执行任何日期操作时发现它很方便)。如果时间也很重要,请选择YYYYMMDDhhmmss. 对于日期时间的 ISO 8601 基本形式,这是一个可接受的变体。如果您需要小数秒计时,请使用 aFLOAT和形式YYYYMMDDhhmmss.fffffffff。请注意,这些形式都不符合 Hive 期望整数或浮点TIMESTAMPs 的方式。

如果日历日期和时间的概念根本不重要,那么使用 aINT作为 Unix 时间戳可能是最简单的,或者FLOAT如果您还需要小数秒,则使用 a。这种形式与 Hive 对 s 的期望是一致TIMESTAMP的。

于 2013-05-08T16:35:56.387 回答