【问题标题】:Wildcard in Java doesn't work for Spark cogroup functionJava 中的通配符不适用于 Spark cogroup 函数
【发布时间】:2017-11-08 22:31:26
【问题描述】:

我正在尝试在 java 中合并两个 RDD,其中一个 RDD v2 的类型如下:JavaPairRDD<Key, ? extends Value>(实际上它是用? extends 定义的,因为它是一个函数参数)。

然后当我将它们组合在一起时,例如:

void f(JavaPairRDD<Key, ? extends Value> v2){
    TYPE v = v1. cogroup(v2);
    // ERROR. I cannot get the correct type for this cogroup function
}

编译器抱怨,因为当我尝试从此 cogroup 函数获取返回值时它无法推断 v2 的类型。

有趣的是,如果我不关心返回值,只需调用:

v1.cogroup(v2).collectAsMap();

似乎可行。至少可以编译。

似乎只有在函数参数中将通配符定义为通配符时,java才能接受通配符(如)作为参数。我说的对吗?

我想问是否有另一种方法可以正确地做到这一点?或者也许我不应该这样做,这里到底出了什么问题?

非常感谢。

【问题讨论】:

  • TYPE 与 Value 有何关系?为什么你不能只使用&lt;Key, Value&gt;
  • 对不起,我没有说清楚。 TYPE 是 cogroup 函数返回值的类型。 I 和 IntelliJ :D 都无法推断调用 v1.cogroup(v2) 的返回类型。
  • 哦,所以这是泛型失败。如果您使用 Object 而不是 TYPE,它应该可以工作。你能包括 cogroup 的函数定义吗? (抽象函数版本)这就是为什么我可以看到编译器试图返回的内容。

标签: java oop generics inheritance apache-spark


【解决方案1】:

似乎只有在函数参数中将通配符定义为通配符时,java才能接受通配符(如? extends Base)作为参数。

cogroup是在scala中定义的,由于scala的类型系统支持协变继承,所以它的接口不包含java的keyward extends

  def cogroup[W](other: JavaPairRDD[K, W]): JavaPairRDD[K, (JIterable[V], JIterable[W])] =
    fromRDD(cogroupResultToJava(rdd.cogroup(other)))

但在Java中,如果函数签名中的参数没有通配符,则调用时的参数不能是某种定义为通配符的类型。

【讨论】:

  • 如何将cogroup 用于大型数据集,例如当我使用collect() 时,它会抛出内存不足异常rdd1 = rdd2.cogroup(rdd3).collect。你能帮忙解决这个问题吗[stackoverflow.com/questions/47180307/….可以分区帮助我是新手,可以帮助解决这个问题。或者有什么方法可以模仿 cogroup。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2022-12-12
  • 2021-11-05
相关资源
最近更新 更多