无法在Hive外部表中查询日期字段

时间:2015-04-17 11:06:32

标签: elasticsearch hive external-tables

完全坚持从hive外部表中获取数据。我到目前为止一直在做。

  1. 我有一个带有日期字段的托管表,其值为2014-10-23。
  2. 我创建了外部表来存储弹性搜索中的数据,如下所示

    创建外部表ext3( run_date日期) ROW FORMAT SERDE'org.elasticsearch.hadoop.hive.EsSerDe' 存储在'org.elasticsearch.hadoop.hive.EsStorageHandler'中 TBLPROPERTIES('es.resource'='dfs / ext3','es.field.read.empty.as.null'='true','es.nodes'=);

  3. 在外部表中插入一行以创建弹性搜索索引和映射。

  4. 问题1: 我的弹性搜索字段创建为字符串。

    1. 后来我将弹性搜索中的映射更改为日期。

      “run_date”:{“type”:“date”,“format”:“yyyy-MM-ddZ”,“index”:“not_analyzed”}

    2. 重新插入外部表中的数据。当我查询Elastic搜索时它非常好。值显示为“2014-10-23 + 08:00”

    3. 问题2 当我查询外部表格的数据,如从ext3选择计数(*)时,我的误差低于此值。

      2015-04-17 18:45:34,254 FATAL [main] org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row [Error getting row data with exception java.lang.ClassCastException: org.apache.hadoop.hive.serde2.io.TimestampWritable cannot be cast to org.apache.hadoop.hive.serde2.io.DateWritable
          at org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableDateObjectInspector.getPrimitiveWritableObject(WritableDateObjectInspector.java:38)
          at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:259)
          at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:349)
          at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:193)
          at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:179)
          at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:545)
      

      伙计们请帮帮我,整天都浪费了。我有另一个包含更多数据的外部表,我需要连接这两个表并创建一个视图,以便我的统一数据可供分析。

1 个答案:

答案 0 :(得分:1)

我认为错误提供了问题的线索:

Error getting row data with exception java.lang.ClassCastException:
  org.apache.hadoop.hive.serde2.io.TimestampWritable cannot be cast to 
  org.apache.hadoop.hive.serde2.io.DateWritable

您的配置单元表中有date字段,但您插入的数据属于timestamp类型。

重新创建您的表格(如果您不想替换它,可以重新创建一个表格)

CREATE EXTERNAL TABLE ext3 ( run_date timestamp )
ROW FORMAT SERDE 'org.elasticsearch.hadoop.hive.EsSerDe' 
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'dfs/ext3', 'es.field.read.empty.as.null' = 'true','es.nodes'=);