gpt4 book ai didi

scala - Scala RDD 不协变的解决方法

转载 作者:行者123 更新时间:2023-12-02 14:10:21 24 4
gpt4 key购买 nike

我正在尝试编写一个函数来操作 RDD[Seq[String]] 对象,例如:

def foo(rdd: RDD[Seq[String]]) = { println("hi") }

不能在 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]]

我猜这是因为 RDD 不是协变的。

我尝试了一些 foo 的定义来解决这个问题。其中只有一个已编译:

def foo2[T[String] <: Seq[String]](rdd: RDD[T[String]]) = { println("hi") }

但它仍然损坏:

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]]

知道如何解决这个问题吗?这一切都发生在 Spark shell 中。

最佳答案

为此,您可以使用 view bound .

Array不是Seq ,但它可以被视为 Seq .

def foo[T <% Seq[String]](rdd: RDD[T]) = ???

<%T可以被视为 Seq[String]这样每当您使用 Seq[String]方法T然后T将转换为Seq[String] .

对于Array[A]被视为 Seq[A]范围内需要有一个隐式函数可以转换 Array发送至Seq s。正如 Ionuş G. Stan 所说,它存在于scala.Predef中。 .

关于scala - Scala RDD 不协变的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23812913/

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