我正在编写一个采用rdd并将其保存为avro文件的方法。问题是,如果我使用特定类型而不是.toDF()
,但我无法在通用rdd上调用.toDF()
!这是一个例子:
case class Person(name: String)
def f(x: RDD[Person]) = x.toDF()
def g[T](x: RDD[T]) = x.toDF()
f(p) //works
g(p) //fails!!
有谁知道为什么我不能在通用rdd上调用.toDF()
并且有什么方法可以解决它?
答案 0 :(得分:1)
如果您使用的是Spark 2,
import org.apache.spark.sql.Encoder
def g[T: Encoder](x: RDD[T]) = x.toDF()
会奏效。
toDF
是implicit conversion
implicit def rddToDatasetHolder[T : Encoder](rdd: RDD[T]): DatasetHolder[T] = {
DatasetHolder(_sqlContext.createDataset(rdd))
}
org.apache.spark.sql.SQLImplicits
中的
要完成,签名应该是相同的。
答案 1 :(得分:0)
import org.apache.spark.sql.Encoder
def g[T: Encoder](x: RDD[T]) = x.toDF()
是正确的 并且您应该使用此方法: `
somefunc{rdd =>
val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate()
import spark.implicits._
g(rdd)
}
`