me STRING?
? )?
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'?
TBLPROPERTIES('es.nodes'='192.168.181.160','es.resource' = 'indexname/typename','es.mapping.names' = 'itemid:itemId, myname:myName, devicenumber:deviceNumber');?
?
在创建Hive外部表时指定映射关系时,也需要对应好数据类型,否则也会出现类似数据类型转换失败错误。
?
注意:
?
从ES的date数据类型转换到Hive的date/timestamp数据类型,均出错,出错信息为:java.io.IOException: java.lang.IllegalArgumentException: 2015-06-03T14:54:46+0800
?
向Elasticsearch写
hive> add jar /opt/cloudera/parcels/CDH-5.3.6-1.cdh5.3.6.p0.11/lib/hive/lib/elasticsearch-hadoop-hive-2.1.1.jar;
#向ES中导入Hive中表sample_07数据?
hive> INSERT OVERWRITE TABLE hive_es_test ?
? ? SELECT s.id, s.code?
? ? ? ? ? ? ? ? ? ? FROM sample_07 s;
?
当Elasticsearch中不存在相应索引时,经过执行以上插入语句,在Elasticsearch中就会创建一个新索引:indexname,新类型:typename(当然是在Hive创建新外部表时指定好的),数据也已经添加入其中。
?
没有指定列映射类型时,下面是部分默认情况下的Hive与ElasticSearch数据类型映射关系。
|Hive|ES|默认映射结果|
|---|---|---|
|bigint|long|无问题|
|timestamp|date|无问题
|double|double|无问题
|date|string|有问题
|decimal|string|有问题
?
注意:
?
可以看到有问题的映射是两端不能匹配的映射。当存在有问题的映射时,在Hive中执行SELECT * FROM table_decimal时会抛出异常:
?
Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.serde2.io.HiveDecimalWritable
?
即数据类型从ElasticSearch到Hive数据类型转换失败。可见,在使用Hive对存储在ElasticSearch中的数据进行操作时,要注意使用双方均支持的数据类型。
?
从Elasticsearch读
?
我们选择以下几条有代表性的SQL查询语句,来验证使用Hive可以对存储在Elasticsearch中的数据进行正确的查询操作。
?
where子句
hive> add jar /opt/cloudera/parcels/CDH-5.3.6-1.cdh5.3.6.p0.11/lib/hive/lib/elasticsearch-hadoop-hive-2.1.1.jar;?
hive> select count(*) from hive_es_angel where id>1000;
?
在执行此语句时,可以看到map-reduce的执行过程:
?
Hadoop job information for Stage-1: number of mappers: 5; number of reducers: 1?
2015-10-15 14:30:28,181 Stage-1 map = 0%, ?reduce = 0%?
2015-10-15 14:30:38,623 Stage-1 map = 2%, ?reduce = 0%, Cumulative CPU 4.07 sec?
2015-10-15 14:30:39,678 Stage-1 map = 4%, ?reduce = 0%, Cumulative CPU 8.8 sec?
2015-10-15 14:30:41,766 Stage-1 map = 5%, ?reduce = 0%, Cumulative CPU 9.36 sec
?
这说明,Hive在执行此语句时,并没有用到Elasticsearch建立的索引,以使查询效率更高,而是将Elasticsearch相应数据全部获取下来。
?
注意:
?
Hive并没有用到Elasticsearch查询高效的好处。
?
普通表与外表关联
hive> add jar /opt/cloudera/parcels/CDH-5.3.6-1.cdh5.3.6.p0.11/lib/hive/lib/elasticsearch-hadoop-hive-2.1.1.jar;?
hive> select * from hive_es_angel left join sample_08 on hive_es_angel.name=sample_08.code;
?
其中sample_08表是Hive普通表,hive_es_angel是数据存储在HBase中的Hive外表。
经验证,通过执行上面语句,可以将Hive普通表与Hive的Elasticsearch外表进行正确的关联。
?
这样一来,ES的SQL插件elasticsearch-sql所不能完成的join等查询语句,便可以通过Hive很好的执行了。
?
Double数据类型求和
hive> add jar /opt/cloudera/parcels/CDH-5.3.6-1.cdh5.3.6.p0.11/lib/hive/lib/elasticsearch-hadoop-hive-2.1.1.jar;?
hive> SELECT SUM(field_double) FROM hive_es_double;
?
由于ElasticSearch并不支持decimal数据类型,故只能在Hive中对小数列创建double数据类型,这时使用Hive也无法进行精确求和,这在需要进行小数精确统计时,是一大问题。
?
Solr也有此缺陷,可见目前ES、Solr天生不适合进行精确计算。故将数据放在ES中,使用Hive或Impala进行SQL精确统计,并非一个好办法。
?
数据存储在Elasticsearch上,使用Impala执行SQL语句
?
hive中建立的普通表,imp