如何将通用rdd转换为数据帧?

时间:2017-08-05 00:49:03

标签: generics apache-spark spark-dataframe

我正在编写一个采用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()并且有什么方法可以解决它?

2 个答案:

答案 0 :(得分:1)

如果您使用的是Spark 2,

import org.apache.spark.sql.Encoder

def g[T: Encoder](x: RDD[T]) = x.toDF()

会奏效。

toDFimplicit 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)
}

`