簡體   English   中英

泛型RDD上的Apache Spark Join / Cogroup

[英]Apache Spark join/cogroup on generic type RDD

我對RDD上的joincogroup方法有問題。 詳細地說,我必須加入兩個RDD ,其中之一是與通配符一起使用的通用類型的RDD

val indexedMeasures = measures.map(m => (m.id(), m)) // RDD[(String, Measure[_]]
val indexedRegistry = registry.map(r => (r.id, r))   // RDD[(String, Registry)]
indexedRegistry.cogroup(indexedMeasures)

最后一條語句給出了編譯時錯誤,如下所示:

no type parameters for method cogroup: (other: org.apache.spark.rdd.RDD[(String, W)])org.apache.spark.rdd.RDD[(String, (Iterable[Registry], 
 Iterable[W]))] exist so that it can be applied to arguments (org.apache.spark.rdd.RDD[(String, Measure[?0]) forSome { type ?0 }]) --- because --- argument expression's type is not compatible 
 with formal parameter type; found : org.apache.spark.rdd.RDD[(String, Measure[?0]) forSome { type ?0 }] required: org.apache.spark.rdd.RDD[(String, ?W)] Note: (String, 
 Measure[?0]) forSome { type ?0 } >: (String, ?W), but class RDD is invariant in type T. You may wish to define T as -T instead. (SLS 4.5)

這里發生了什么? 為什么我不能cogroup RDD使用一個通用的通配S型?

感謝您的所有回復。

該問題在《 爭取更高種類的類型的平等權利》中有闡述

泛型是當代OO語言(例如Java,C#或Scala)非常流行的功能。 但是,他們缺乏對通用性的支持。 問題在於它們僅支持對適當類型的抽象,而不對泛型類型的抽象。 這種限制使得不可能例如為Iterable定義精確的接口,這是Scala集合API中的核心抽象。 我們在Scala 2.5中實現了“類型構造函數多態性”,從根本上解決了這個問題,從而大大減少了類型簽名和代碼的重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM