将Elasticsearch嵌套对象映射到Hive表列

时间:2015-03-10 01:14:50

标签: elasticsearch hive

我正在尝试通过创建外部表将数据从弹性搜索提取到配置单元。到目前为止,我可以使用点表示法将列映射到嵌套属性。 例如。 hivecolname:escolname - > EMP_ID:employees.employee1.id

但是,我现在有以下结构: -

    "encounters": [
            {
              "id": 241,
              "admitDate": "2014-12-01T08:04:00Z"
            },
            {
                 "id": 2411,
                 "admitDate": "2014-10-01T08:04:00Z"
              }
           ]

这意味着遇到属性可以包含任意数量的元素。我正在使用以下查询在配置单元中创建外部表: -

CREATE EXTERNAL TABLE tableName(encounters array<struct<admitDate:string, id:bigint>>) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource' = 'ads/dReg', 'es.nodes' = 'localhost','es.port' = '9200','es.query' = '?q=*', 'es.mapping.names' = 'encounters:encounters');

但是,当我从tableName执行Select *时,我遇到异常: -

java.lang.ClassCastException: org.elasticsearch.hadoop.mr.LinkedMapWritable cannot be cast to org.apache.hadoop.io.ArrayWritable

1 个答案:

答案 0 :(得分:0)

admitDate存在问题;给定格式ES将其保存为&#34; datetime&#34;而你在hive中将它定义为&#34; string&#34 ;;如果你将它重新定义为&#34;时间戳&#34;在配置单元中(或者在ES中将其映射为字符串)一切都应该可以解决。