我想准备一个Java类,它将从Elasticsearch读取索引,使用Spark执行聚合,然后将结果写回Elasticsearch。目标模式(以StructType的形式)与源模式相同。我的代码如下
RabbitTemplate
我使用的是最新版本的 spark-core_2.11 和 elasticsearch-spark-20_2.11 。前面的代码导致以下异常
@RabbitListener
任何想法我做错了什么?
答案 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。