Как преобразовать JavaPairRDD в HashMap

У меня есть JavaPairDStream, содержащий пару ключ-значение. Мне нужно преобразовать его в HashMap.Я попытался сделать то же самое с обычным JavaPairRDD, вызвав на нем функцию "collectAsMap()" и ее работу, но когда я пытаюсь сделать то же самое на 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.call(CSV_Spark.java:109)
    at attempt1.CSV_Spark.call(CSV_Spark.java:1)

Я не уверен, является ли мой метод правильным или нет. Есть ли разница между обычным "JavaPairRDD" и тем, который создан функцией "foreachRDD"? Почему тот же метод работает на обычном "JavaPairRDD", но терпит неудачу, когда я применяю его к "JavaPairRDD", созданному путем применения функции "foreachRDD" на JavaPairDStream. Если я ошибаюсь ... в любом месте, тогда любезно дайте мне знать. Также, если есть какой-либо другой способ, пожалуйста, разместите его здесь. Спасибо.

2 ответов


во время компиляции, вниз литье принимается как оба карта и 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, которая содержит K, V>пар . Теперь требуется преобразовать JavaPairRDD в объект HashMap для дальнейших вычислений в вашем приложении. Использовать collectAsMap метод и назначить его результат карта сам объект. После этого, вы можете создать HashMap, передав карта экземпляр .


вы могли бы попробовать

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

что эквивалентно своего рода букетизации вокруг validTime моментов времени типа , поскольку вы рассуждаете о потоке.

или, используя forEachRDD, затем оберните

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

оттуда collectAsMap.

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