2013-05-07 82 views
1

我想存儲表使用Hive(hive hbase集成) 我的表包含一個字段鍵入TIMESTAMP(如日期) 我已經做了一些研究,我發現TIMESTAMP不支持HBASE,我應該怎麼做?配置單元hbase積分時間戳

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

做的是將TIMESTAMP轉換爲STRINGINT,或FLOAT最簡單的事情。這將有不幸的副作用,放棄Hive的內置TIMESTAMP支持。由於這一點,你就會失去

  • 讀寫時間檢查,以確保您的列包含透明地使用不同格式
  • 採用蜂巢的UDF其上TIMESTAMP s運行TIMESTAMPS個有效TIMESTAMP
  • 的能力。

如果您爲自己的時間戳選擇單一格式並堅持下來,前兩種損失將得到緩解。最後一項並不是很大的損失,因爲only two Hive date functions實際上在TIMESTAMP上運行。他們大多數在STRING s上運作。如果您需要使用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 s一致。

如果日曆日期和時間的概念根本不重要,那麼使用INT作爲Unix時間戳可能是最簡單的,或者如果您還需要小數秒,則使用FLOAT。這種形式與Hive預計TIMESTAMP的方式一致。