使用Spark in Java在Elasticsearch索引中执行聚合

时间:2016-10-03 19:47:46

标签: elasticsearch apache-spark apache-spark-sql

我想准备一个Java类,它将从Elasticsearch读取索引,使用Spark执行聚合,然后将结果写回Elasticsearch。目标模式(以StructType的形式)与源模式相同。我的代码如下

RabbitTemplate

我使用的是最新版本的 spark-core_2.11 elasticsearch-spark-20_2.11 。前面的代码导致以下异常

@RabbitListener

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:0)

您收到此异常是因为sqlContext.createDataFrame(rdd, customSchema)需要RDD<CustomSchemaJavaBean>,而是将JavaPairRDD.toRDD(pairRDD) RDD<Tuple2<String, Map<String, Object>>>的结果传递给JavaPairRDD<String, Map<String, Object>>。您必须将RDD<CustomSchemaJavaBean>映射到SparkConf conf = new SparkConf().setAppName("Aggregation").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); SQLContext sqlContext = new SQLContext(sc); JavaRDD<CustomSchemaBean> rdd = JavaEsSpark.esRDD(sc, "kpi_aggregator/record") .map(tuple2 -> { /**transform Tuple2<String, Map<String, Object>> to CustomSchemaBean **/ return new CustomSchemaBean(????); } ); Dataset df = sqlContext.createDataFrame(rdd, customSchema); df.registerTempTable("data"); Dataset kpi1 = sqlContext.sql("SELECT host, SUM(bytes_uplink), SUM(bytes_downlink) FROM data GROUP BY host"); JavaEsSparkSQL.saveToEs(kpi1, "kpi_aggregator_total/record");

{{1}}

注意我使用JavaRDD而不是RDD这两种方法都是legal