将JavaRDD <row>转换为JavaPairRDD <string,map>

时间:2018-05-15 11:54:51

标签: java apache-spark rdd

我得到JavaRDD<Row>ROW来自here)的实例,我希望将其转换为JavaPairRDD<String,Map>,因为之后我想与其他rdd一起加入。{ (内联有点偏离主题问题:它会起作用吗?具体来说,将Map作为JavaPairRDD的第二个类型参数会导致正确合并键值对吗?)< / p>

当我这样做时:

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

  5. 我对GenericRowWithSchemaUnmodifiableMap感到有些惊讶。我继续按以下方式组建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 :(得分:0)

能够如下进行:

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中访问单元格值。事实上,我仍然没有完全得到它。我应该使用getString() flatMapToPair()个州mapToPair(),但它无效。有人可以解释原因吗?

此外,不需要--- - hosts: localhost gather_facts: yes tasks: - debug: var=ansible_facts.hostname - debug: var=ansible_hostname 。我可以使用("love", "i", "money")