elasticsearch-hadoop,Apache Spark,Spark Streaming,elasticsearch Hadoop" /> elasticsearch-hadoop,Apache Spark,Spark Streaming,elasticsearch Hadoop" />

Apache spark 将Spark Streaming的输出字段名映射到Elastic Search

Apache spark 将Spark Streaming的输出字段名映射到Elastic Search,apache-spark,spark-streaming,elasticsearch-hadoop,Apache Spark,Spark Streaming,elasticsearch Hadoop,我使用以下代码将Spark Streaming的输出存储到ElasticSearch。我想将spark streaming的输出映射到适当的名称,即(Key、OsName、PlatFormName、Mobile、BrowserName、Count)。但正如你所看到的,目前它被映射到ES中,如_1或_2等。 此外,我想在索引ES中的数据之前放置一些过滤器,例如(如果PlatFormName=“ubuntu”,则索引数据)。那么,我该怎么做呢 val realTimeAgg = lines.map

我使用以下代码将
Spark Streaming
的输出存储到
ElasticSearch
。我想将spark streaming的输出映射到适当的名称
,即(Key、OsName、PlatFormName、Mobile、BrowserName、Count)
。但正如你所看到的,目前它被映射到ES中,如_1或_2等。 此外,我想在索引ES中的数据之前放置一些过滤器,例如
(如果PlatFormName=“ubuntu”,则索引数据)
。那么,我该怎么做呢

 val realTimeAgg = lines.map{ x => ((x.key, x.os, x.platform, x.mobile, x.browser), 1)}.reduceByKey(_+_)

            val pageCounts = realTimeAgg.map    
            pageCounts.foreachRDD{ x => 
                    if (x.toLocalIterator.nonEmpty) {       
                        EsSpark.saveToEs(x, "spark/ElasticSearch")
                    }
                }   

            ssc.start()
            ssc.awaitTermination()
ElasticSearch中的输出:

{
            "_index": "spark",
            "_type": "ElasticSearch",
            "_id": "AVTH0JPgzgtrAOUg77qq",
            "_score": 1,
            "_source": {
               "_1": {
                  "_3": "Amiga",
                  "_2": "AmigaOS 1.3",
                  "_6": "SeaMonkey",
                  "_1": "Usedcar",
                  "_4": 0,
                  "_5": 0
               },
               "_2": 1013
            }
         }

弹性搜索文档的键是_1、_2等,因为您存储的是具有(Tuple6,Long)数据类型的PairRDD

要保留键,应使用case类作为键

val realTimeAgg = lines.map{ x => (x, 1)}.reduceByKey(_+_)
我假设对象x的类是一个case类,并且您希望使用该类的所有字段来进行缩减(即检查两个case类实例的相等性)。如果该类的所有字段不是用于相等的类的自然键,则有两个选项-

  • 覆盖案例类的equals和hashCode
  • 创建另一个仅包含关键字段的案例类(您在元组中使用的字段-(x.key,x.os,x.platform,x.mobile,x.browser))并映射到该案例类,而不是第一行的元组。map{x=>…}
  • 您可以在写入ElasticSearch之前添加所需的过滤器

    pageCounts.foreachRDD { x => 
                            if (x.toLocalIterator.nonEmpty) {
                                val y = x.filter(z => z._1.platform == "ubuntu")       
                                EsSpark.saveToEs(y, "spark/ElasticSearch")
                        }
                    }  
    

    PS:如果您使用(case-class,Long)case-class作为键来测试RDD对,就像我建议的lines.map(x=>(x,1)).reduceByKey(+382;)。有一个与Spark Shell特别相关的bug,case类不能作为reduce操作的关键类正确工作-

    谢谢。我实施了你的第二个建议。请你详细说明一下你的第一个建议是什么意思,举一个我没有理解的例子。更糟糕的是,当您将作业提交给spark clsuter时,这个bug似乎不会出现,对吗?@Naresh,在第一个选项中,我指的是覆盖现有类中的equals&hashCode方法(如果需要),如(此线程建议)[。是的,这个bug只存在于spark shell中,而不是在集群上运行时。