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

Generics 如何将通用rdd转换为数据帧?,generics,apache-spark,spark-dataframe,Generics,Apache Spark,Spark Dataframe,我正在编写一个方法,它接受rdd并将其保存为avro文件。问题是,如果我使用特定的类型,那么我就不能在通用rdd上调用.toDF(),但是我不能调用.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(),以及是否有

我正在编写一个方法,它接受rdd并将其保存为avro文件。问题是,如果我使用特定的类型,那么我就不能在通用rdd上调用
.toDF()
,但是我不能调用
.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()
,以及是否有办法解决这个问题吗?

如果您使用的是Spark 2

import org.apache.spark.sql.Encoder

def g[T: Encoder](x: RDD[T]) = x.toDF()
会有用的

toDF
是通过
隐式转换添加的方法

implicit def rddToDatasetHolder[T : Encoder](rdd: RDD[T]): DatasetHolder[T] = {
  DatasetHolder(_sqlContext.createDataset(rdd))
}
org.apache.spark.sql.SQLImplicits

为了实现这一点,签名应该是相同的

import org.apache.spark.sql.Encoder
def g[T: Encoder](x: RDD[T]) = x.toDF()
是的 您应该使用以下方法: `


`

调用需要编写函数
g()
.toDf
太难了?但是,您是如何获得RDD的?没有其他方法可以获取数据帧(或Spark2中的数据集)@cricket_007
f
g
不是我正在编写的实际函数。我想编写一个函数,用附加功能(如检查点)包装RDD,以便在数据已经生成时加载数据,否则我将触发DAG生成数据集并将其保存到磁盘。Dataframe有几种格式可以保存,但RDD只有
saveAsTextFile
saveAsObject
(不管“对象”是什么意思)。@cricket_007我没有使用Dataframe/dataset,因为我不能像使用RDD那样更改DAG中的分区数,这会导致性能问题(对于spark 1.6,也许他们现在已经解决了这个问题)。
somefunc{rdd =>
    val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate()
    import spark.implicits._
    g(rdd)
}