我正在尝试通过创建外部表将数据从弹性搜索提取到配置单元。到目前为止,我可以使用点表示法将列映射到嵌套属性。 例如。 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
答案 0 :(得分:0)
admitDate存在问题;给定格式ES将其保存为&#34; datetime&#34;而你在hive中将它定义为&#34; string&#34 ;;如果你将它重新定义为&#34;时间戳&#34;在配置单元中(或者在ES中将其映射为字符串)一切都应该可以解决。