我想使用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)
答案 0 :(得分:1)
最简单的方法是将TIMESTAMP
转换为STRING
,INT
或FLOAT
。这会产生令人遗憾的副作用,即放弃Hive内置的TIMESTAMP
支持。因此,你将失去
TIMESTAMP
TIMESTAMPS
TIMESTAMP
s。如果您为自己的时间戳选择单一格式并坚持下去,那么前两个损失就会减轻。最后一次并不是一个巨大的损失,因为only two Hive date functions实际上在TIMESTAMP
上运行。他们中的大多数都在STRING
上运作。如果您非常需要from_utc_timestamp
和from_utc_timestamp
,则可以编写自己的UDF。
如果您使用STRING
并且只需要日期,我会使用yyyy-mm-dd
格式。如果您需要时间,请使用yyyy-mm-dd hh:mm:ss
或yyyy-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
的方式一致。