Как преобразовать 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()