背景:我们希望将es中的数据通过elasticsearch-hadoop、或是elasticsearch-spark connector将其映射成hive\spark-sql 表,然后通过HQL,spark-sql 进行查询分析。
目的是DA分析工具统一,全部是类sql形式,不需要在学习es查询语法,另外方便关联。好了,开始跳坑
坑1:
elasticsearch-hadoop 和 elasticsearch-spark 是不同的两个连接器,es-hadoop是hive的,es-spark是spark的。并且不能互相存在,会提示冲突。建表语法也不一样。
坑2:
用es-spark创建的表,通过hive的jdbc方式不能够select 出正常数据。但是可以对表进行删除。
坑3:
hive建完表以后,小数据读取问题不大,一旦数据量一大以后,速度非常慢,慢的无法忍受。
主要原因是HSL过滤的时候,不是在es层面过滤的,而是将所有数据捞回来,再过滤。es-spark会解决这个问题。
坑3:
最最最主要的就是es-spark有一个功能叫pushdown。 这个功能可以条件语法穿透。
举例:
select * from table where name = ‘lisi’
es-spark 直接会把这个语句转化成es 语法,并把过滤以后的数据返回给spark。
但是,es-spark的不支持 数组(列表) 里嵌套 例如es里是这样结构 list[{a:1}, {b:2}],且列表里长度是不固定的。就更难受。。。
通过dataframe 看schame 是 struct 。不是 list
坑4:
es 里的列名是区分大小写的,hive表列名是不区分大小写的。所以在建表时要用 es.mapping.names ‘modelrulecode:modelRuleCode’ 做对应,左边是hive表列名,后边是es里的列名。
这个问题在es-spark 下没有。