spark 使用elasticsearch-spark connector读取ES 跳坑记录

背景:我们希望将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 下没有。

    原文作者:迷茫_小青年
    原文地址: https://www.jianshu.com/p/fbd787154566
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞