Преобразовать JavaRDD <Row>в JavaPairRDD <String, Map> - PullRequest
0 голосов
/ 15 мая 2018

Я получаю экземпляр JavaRDD<Row> (ROW из здесь ), который я хочу преобразовать в JavaPairRDD<String,Map>, потому что впоследствии я хочу присоединить его к другому rdd. ( Встроенный несколько не по теме вопрос : будет ли он работать? В частности, будет ли Map в качестве параметра второго типа JavaPairRDD привести к правильному объединению пар ключ-значение?)

Когда я делаю:

System.out.println(rdd.collect());

Распечатывается в следующем формате:

[[{key1=val11,key2=val12,key3=val13,...}],[{key1=val21,key2=val22,key3=val23,...}],...,[{key1=val31,key2=val32,key3=val33,...}]]

Обратите внимание, что формат [[{}],[{}],...[{}]]. Это потому, что rdd содержит список Row с, где каждый Row содержит UnfodifiableMap (как объяснено ниже). Я хочу, чтобы значение key7 было ключом в JavaPairRDD. То есть я хочу, чтобы последующая форма была конечной формой вывода:

{val17={key1=val11,key2=val12,key3=val13,...}, val27={key1=val21,key2=val22,key3=val23,...},..., val37={key1=val31,key2=val32,key3=val33,...}}

Я начал с наблюдения содержимого rdd в узле отладки внутри макета foreach:

enter image description here

Наблюдение различных значений в режиме отладки:

  1. JavaRDD содержит GenericRowWithSchema:
    enter image description here

  2. f.get(0) возвращает карту:
    enter image description here

  3. Я не могу получить доступ к чему-либо из карты выше: enter image description here

  4. Его (f.get(0)) на самом деле UnmodifiableMap:
    enter image description here

Я немного удивлен, что GenericRowWithSchema и UnmodifiableMap. Я продолжил, набрав JavaPairRDD следующим образом:

JavaPairRDD<String, Map> pairrdd = neo4jrdd.flatMapToPair(f -> { 
        return new Tuple2<String, Map>(f.getString(7),(Map)f.get(0));
});

Но это дает мне:

Type mismatch: cannot convert from JavaPairRDD<Object,Object> to JavaPairRDD<String,Map>

Я не могу догадаться, как я могу получить JavaPairRDD от JavaRDD<Row>. Где я иду не так с выше?

1 Ответ

0 голосов
/ 15 мая 2018

Удалось сделать это следующим образом:

JavaPairRDD<String, Map> pairRdd = rdd.mapToPair(f -> {
        return new Tuple2<String, Map>(((Map)f.get(0)).get("id").toString(), ((Map)f.get(0)));
    });

f.get(0).get("id") выше соответствует f.getString(7), то есть я неправильно понял, как получить доступ к значениям ячеек в Row. На самом деле я до сих пор не понимаю полностью. Row API утверждает, что я должен использовать getString(), но он не работает. Может кто-нибудь объяснить, почему?

Также нет необходимости в flatMapToPair(). Я могу сделать это с mapToPair().

...