将iterable转换为RDD

时间:2016-08-08 07:09:42

标签: java elasticsearch apache-spark spark-streaming elasticsearch-plugin

我想从火花流式传输到几个弹性搜索索引。 我创建<key(index), value>对,当我执行groupByKey时,结果是<key(index), Iterable<value>>的元组但是为了使用elasticsearch-spark插件保存到elasticsearch,我需要将值JavaRDD<value>

我知道有一个sparkContext.parallelize(list)选项可以从列表中创建JavaRDD,但这只能在驱动程序上执行。

是否有另一个选项来创建可以在执行程序上执行的JavaRDD?或者我可以实现Tuple2<key(index), JavaRDD<value>>在执行者身上工作的另一种方式? 如果不是,我怎么才能在驱动程序上只将Iterator切换到JavaRDD并且在执行程序中写入elasticsearch?

谢谢,

丹妮拉

1 个答案:

答案 0 :(得分:1)

我说必须像以下一样有可能吗?

JavaPairRDD<Key, Iterable<Value>> pair = ...;
JavaRDD<Iterable<Value>> values = pair.map(t2 -> t2._2());
JavaRDD<Value> onlyValues = values.flatMap(it -> it);

替代方法是

JavaPairRDD<Key, Iterable<Value>> pair = ...;
JavaRDD<Key, Value> keyValues = pair.flatMapValues(v1 -> v1);
JavaRDD<Value> values = keyValues.map(t2 -> t2._2());