В Java, как связать исходный RDD и RDD, который я получаю после преобразований

У меня есть RDD пользовательских объектов, скажем, Person. затем я использую несколько узких (хотя может быть и широких) преобразований на этом RDD, каждый раз, когда я получаю новый RDD. наконец, я получаю RDD другого типа, скажем, Integer. Теперь я хочу каким-то образом узнать, что Integer связано с каждым Person, и напечатать это так:

person a -> 3
person b -> 1
person c -> 7

Я пробовал: JavaPairRDD resultRDD = myRDD.mapToPair(rec -> new Tuple2(rec, new SomeFunction.call(rec)));

этот код работает для меня, потому что я могу получить каждый кортеж и распечатать его. но я не уверен, что это хороший способ реализовать это, когда есть много преобразований (не так ли?)

думал использовать другой вариант: transformedRDD.parent(number,evidence) и таким образом получить исходный RDD, а затем как-то определить связь между Person и Integer.

Примечание: evidence это scala.reflect.ClassTag<U>, и я не знаком со scala, поэтому я не очень понимаю, что там писать

Любая помощь будет оценена!


person Ghost    schedule 07.05.2016    source источник
comment
Оставить уникальный идентификатор для каждой строки? :П   -  person Alberto Bonsanto    schedule 08.05.2016


Ответы (3)


Я бы просто носил с собой ключ всю дорогу. Таким образом, легче избежать промаха идентификации, поскольку каждый объект каждый раз имеет свой идентификатор. другими словами:

persons
.map(p => (id, p))
.map( (id, p) => (id, transformation1(p)) )
.map( (id, p) => (id, transformation2(p)) )
....
person z-star    schedule 08.05.2016
comment
спасибо за помощь, в конце концов я сделал что-то близкое к этому, выложу через минуту. - person Ghost; 13.05.2016

Я думаю, что нет правильного или неправильного ответа на этот вопрос. Хотя может быть и лучший ответ.

Вы на правильном пути, чтобы сначала подумать о превращении rdd в PairRDD. Однако, как вы сказали, в исходной структуре RDD есть много преобразований, она быстро усложняется.

Dependency graph Извините за плохой рисунок.. В любом случае, наверное, для мультизависимости не очень понятно, что ставить в ключевое поле PairRDD. Я не уверен, что это так для вас, но я думаю, что если отношение не один к одному, может быть много лиц, которые производят одно целое число. Если вы используете операцию редукции к целому числу, прежде чем интерпретировать информацию о зависимости, вам необходимо учитывать, что у целого числа может быть не только один предок.

В любом случае, я думаю, что лучший способ решить эту проблему — добавить поле ArrayList с уникальным идентификатором в RDD. Вместо создания PairRDD, добавляющего ненужную структуру, просто подумайте об этом поле как о графе, обозначающем родословную текущего поля RDD.

Например, объект Persons будет иметь поле с именем «зависимость», длина которого равна 0 arraylist, поскольку у него нет предка. После этого допустим, что у вас по какой-то причине произошло преобразование в Double. Затем результирующий RDD содержит поле с именем «зависимость», длина которого равна 1, что обозначает поле уникального идентификатора объекта Person. Наконец, у нас есть преобразование в Integer. Опять же, у нас есть RDD с полем с именем «зависимость», которое имеет длину 2 (потому что у нас было два предка для этого одного целого числа), которое обозначает уникальный идентификатор объекта Person и уникальный идентификатор объекта Double.

Я думаю, что мое объяснение немного длинное и многословное, но я надеюсь, что вы поняли смысл.

Наконец, если вы выполняете операцию сокращения между RDD, вы должны подумать, действительно ли у вас есть случай один к одному. Поскольку одно целое число могло не исходить от одного объекта Person, если вы хотите обнаружить полную родословную этого целого числа, вам нужно добавить всю информацию о зависимостях в список массивов. Кроме того, когда вы расшифровываете этот список массивов «зависимостей», вы должны иметь в виду, что длина списка может быть произвольной, если отношение не один к одному и если вы используете сокращение между СДР.

Я думал, что лучшим решением было это, но я думаю, что на этот вопрос может быть более простой ответ. Если вы узнаете один, дайте мне знать!

person Hyun Joon Kim    schedule 08.05.2016
comment
спасибо за помощь, в конце концов я решил это по-другому, опубликую через минуту - person Ghost; 13.05.2016

После некоторых экспериментов я решил использовать следующее решение:

JavaRDD<Person> persons = sc.parallelize(personList);
JavaRDD<Person,SomeType> trans1 = persons.mapToPair(p -> new Tuple2<Person,SomeType>(p, someFunction.call(p)));
JavaRDD<Person,OtherType> trans2 = trans1.mapToPair(tuple -> new Tuple2<Person,OtherType>(tuple._1(), otherFunction.call(tuple._2())));

вы можете продолжать сколько угодно, и у вас всегда будет ссылка на объект Person. Это можно сделать более лаконично с помощью .mapToPair без объявления других RDD, но для меня это более понятно.

person Ghost    schedule 13.05.2016