use*_*020 7 types scala covariance apache-spark
我正在尝试编写一个函数来操作RDD [Seq [String]]对象,例如:
def foo(rdd: RDD[Seq[String]]) = { println("hi") }
Run Code Online (Sandbox Code Playgroud)
无法在RDD [Array [String]]类型的对象上调用此函数:
val testRdd : RDD[Array[String]] = sc.textFile("somefile").map(_.split("\\|", -1))
foo(testRdd)
->
error: type mismatch;
found : org.apache.spark.rdd.RDD[Array[String]]
required: org.apache.spark.rdd.RDD[Seq[String]]
Run Code Online (Sandbox Code Playgroud)
我想这是因为RDD不是协变的.
我已经尝试了一堆foo的定义来解决这个问题.其中只有一个编译过:
def foo2[T[String] <: Seq[String]](rdd: RDD[T[String]]) = { println("hi") }
Run Code Online (Sandbox Code Playgroud)
但它仍然被打破:
foo2(testRdd)
->
<console>:101: error: inferred type arguments [Array] do not conform to method foo2's type
parameter bounds [T[String] <: Seq[String]]
foo2(testRdd)
^
<console>:101: error: type mismatch;
found : org.apache.spark.rdd.RDD[Array[String]]
required: org.apache.spark.rdd.RDD[T[String]]
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?这一切都发生在Spark shell中.
为此,您可以使用视图绑定.
Array
不是Seq
,但它可以被视为一个Seq
.
def foo[T <% Seq[String]](rdd: RDD[T]) = ???
Run Code Online (Sandbox Code Playgroud)
该<%
说,T
可以被看作是Seq[String]
这样,只要你使用Seq[String]
的方法T
,然后T
将转换为Seq[String]
.
为了Array[A]
被视为Seq[A]
需要在范围内可以将Array
s 转换为Seq
s 的隐式函数.正如IonuţG . Stan所说,它存在于scala.Predef中.
归档时间: |
|
查看次数: |
1638 次 |
最近记录: |