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