gpt4 book ai didi

apache-spark - 如何将JavaPairRDD转换为HashMap

转载 作者:行者123 更新时间:2023-12-03 07:17:26 25 4
gpt4 key购买 nike

我有一个包含键值对的JavaPairDStream。我需要将其转换为 HashMap。我尝试通过在普通 JavaPairRDD 上调用“collectAsMap()”函数及其工作方式来执行相同操作,但是当我尝试在 DStream 上执行相同操作时,它失败了。

我试图通过使用“foreachRDD”函数将“JavaPairDStream”转换为“JavaPairRDD”来实现相同的目的,然后我在JavaPairRDD上使用“collectAsMap()”函数。

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)

我不确定我的方法是否正确。普通的“JavaPairRDD”和“foreachRDD”函数创建的有什么区别吗?为什么相同的方法适用于普通的“JavaPairRDD”,但当我将其应用于通过在 JavaPairDStream 上应用“foreachRDD”函数创建的“JavaPairRDD”时失败。如果我在任何地方出错,请告诉我。另外,如果还有其他方法,请在这里发布。谢谢。

最佳答案

在编译时,接受向下转换,因为 MapHashMap 都处于同一继承中。虽然我们没有得到任何编译时错误,但我们会在运行时得到 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);

注意:rddInstanceJavaRDD类型的对象。

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

关于apache-spark - 如何将JavaPairRDD转换为HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25230363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com