无法在 Hive 外部查询日期字段 table
Unable to query date field in Hive external table
完全无法从外部配置单元获取数据table。到目前为止,我已经完成了。
- 我有一个托管 table,日期字段的值为 2014-10-23。
我创建了外部 table 来在弹性搜索中存储数据,如下所示
创建外部 table ext3 (
run_date 日期)
行格式 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'=);
在外部插入一行 table 以创建弹性搜索索引和映射。
问题一:
我的弹性搜索字段创建为字符串。
后来把elasticsearch里的mapping改成了date
"run_date":{"type":"date","format":"yyyy-MM-ddZ","index":"not_analyzed"}
重新插入外部数据table。当我查询弹性搜索时,它非常好。值显示为 '2014-10-23+08:00'
问题 2
当我从 ext3 查询外部 table 的数据时,例如 select count(*) 我遇到了以下错误。
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)
伙计们请帮帮我,一整天都浪费了。我有另一个包含更多数据的外部 table,我需要加入这两个 table 并创建一个视图以准备好我的合并数据以供分析。
我认为该错误为您的问题提供了线索:
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
您的配置单元 table 中有一个 date
字段,但您插入的数据属于 timestamp
类型。
重新创建您的 table(如果您不想替换它,也可以创建一个新的)
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'=);
完全无法从外部配置单元获取数据table。到目前为止,我已经完成了。
- 我有一个托管 table,日期字段的值为 2014-10-23。
我创建了外部 table 来在弹性搜索中存储数据,如下所示
创建外部 table ext3 ( run_date 日期) 行格式 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'=);
在外部插入一行 table 以创建弹性搜索索引和映射。
问题一: 我的弹性搜索字段创建为字符串。
后来把elasticsearch里的mapping改成了date
"run_date":{"type":"date","format":"yyyy-MM-ddZ","index":"not_analyzed"}
重新插入外部数据table。当我查询弹性搜索时,它非常好。值显示为 '2014-10-23+08:00'
问题 2 当我从 ext3 查询外部 table 的数据时,例如 select count(*) 我遇到了以下错误。
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)
伙计们请帮帮我,一整天都浪费了。我有另一个包含更多数据的外部 table,我需要加入这两个 table 并创建一个视图以准备好我的合并数据以供分析。
我认为该错误为您的问题提供了线索:
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
您的配置单元 table 中有一个 date
字段,但您插入的数据属于 timestamp
类型。
重新创建您的 table(如果您不想替换它,也可以创建一个新的)
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'=);