1

Я хочу, чтобы сохранить от искрового потока до пары индексов эластичного поиска. Я создаю пары <key(index), value>, когда я выполняю groupByKey, получается Tuple из <key(index), Iterable<value>>, но для того, чтобы сэкономить на поиске elastics с помощью плагина elasticsearch-spark, мне нужны значения как JavaRDD<value>.Конвертировать итерацию в RDD

Я знаю, что есть опция sparkContext.parallelize (list), которая создает JavaRDD из списка, но это может быть выполнено только для драйвера.

Есть ли другой способ создать JavaRDD, который может быть выполнен на исполнителе? Или другим способом, которым я могу достичь Tuple2<key(index), JavaRDD<value>>, который работает на исполнителя? Если нет, то как я могу сделать только коммутатор Iterator для JavaRDD на драйвере и плагиновую запись в elasticsearch у исполнителя?

Спасибо,

Daniela

+0

Ehm , AFAIK, 'groupByKey' приводит к' JavaPairRDD > ', который по-прежнему является' rdd' , Любая дальнейшая обработка 'rdd' выполняется, таким образом, для исполнителей, а не для драйвера. –

ответ

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()); 
+0

благодаря Evgenii, так как мне нужно получить от JavaPairRDD > в JavaRDD , что внутри foreachRDD результат значений JavaRDD = rdd.flatMap ((FlatMapFunction >, String>) tuple2 - > { final l = Lists.newArrayList(); tuple2._2(). ForEach (l: add); return l; }); связаны с одним и тем же ключом? – Daniela

+0

Я, вероятно, неправильно понял ваш вопрос. Я отредактирую свой ответ, надеюсь, на этот раз все будет лучше. – evgenii

Смежные вопросы