如何将JavaPairRDD转换为HashMap

时间:2014-08-10 15:55:06

标签: apache-spark rdd

我有一个包含键值对的JavaPairDStream。我需要将它转换为HashMap。我已经尝试通过调用" collectAsMap()"对普通的JavaPairRDD做同样的事情。函数和它的工作,但当我试图在DStream上做同样的事情时,它失败了。

我试图通过转换" JavaPairDStream"来实现同样的目标。进入" JavaPairRDD"通过使用" foreachRDD"函数,然后我使用" collectAsMap()" JavaPairRDD上的函数。

Map<String,String> value= new HashMap<String,String>();
            value=line.collectAsMap();

//Here "line" is a "JavaPairRDD<String,String>".

它没有给出任何编译错误,但是当我运行程序时它会失败并抛出错误,如下所示。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lscala.Tuple2;
    at org.apache.spark.rdd.PairRDDFunctions.collectAsMap(PairRDDFunctions.scala:447)
    at org.apache.spark.api.java.JavaPairRDD.collectAsMap(JavaPairRDD.scala:464)
    at attempt1.CSV_Spark$3.call(CSV_Spark.java:109)
    at attempt1.CSV_Spark$3.call(CSV_Spark.java:1)

我不确定我的方法是否正确。普通&#34; JavaPairRDD&#34;之间有什么区别吗?和#e; foreachRDD&#34;功能?为什么相同的方法适用于普通的&#34; JavaPairRDD&#34;但是当我将它应用于#34; JavaPairRDD&#34;通过应用&#34; foreachRDD&#34; JavaPairDStream上的函数。如果我在任何地方出错,请告诉我。如果还有其他方式,请在此处发布。感谢。

2 个答案:

答案 0 :(得分:1)

在编译时,接受向下转换,因为 Map HashMap 属于同一继承。虽然我们没有得到任何编译时错误,但我们将在运行时获得ClassCastException。为避免此问题,您可以尝试:

代码:

JavaPairRDD<K, V> javaRDDPair  = rddInstance.mapToPair(new PairFunction<T, K, V>() {
   @Override
    public Tuple2<K, V> call(final T value) {
    // statements 
    // operations on value
    return new Tuple2<K, V>(KTypeValue, VTypeValue);
    }
    });

    Map<K,V> map =  javaRDDPair.collectAsMap();
    HashMap<K,V> hmap = new HashMap<K,V>(map);

注意: rddInstance JavaRDD 类型的对象。

假设我们有 JavaRDD ,其中包含 T 类型值。 转换后,我们创建 JavaPairRDD ,其中包含&lt; K,V &gt; 。 现在的要求是将JavaPairRDD转换为HashMap对象,以便在应用程序中进行进一步的计算。使用 collectAsMap 方法并将其结果分配给 Map 对象本身。之后,您可以通过传递地图 实例来创建 HashMap

答案 1 :(得分:0)

你可以尝试

JavaPairDStream stream =... 
JavaPairRDD pairRdd=stream.compute(validTime);

这相当于在Time类型的validTime时刻周围的一种分段,就像你在流上推理一样。

或者,使用forEachRDD,然后换行

JavaPairRDD<K,V> wrapRDD(RDD<scala.Tuple2<K,V>> rdd)

从那里收集地图。

java.util.Map<K,V>  collectAsMap()