如何将Encoder作为参数传递给dataframe作为方法

时间:2016-11-19 12:08:38

标签: scala csv apache-spark dataframe dataset

我想通过使用不同的case类将dataFrame转换为dataSet。 现在,我的代码如下所示。

case Class Views(views: Double)
case Class Clicks(clicks: Double)

def convertViewsDFtoDS(df: DataFrame){
    df.as[Views]
}

def convertClicksDFtoDS(df: DataFrame){
    df.as[Clicks]
}

所以,我的问题是“无论如何我可以使用一个通用函数来通过案例类作为此函数的额外参数吗?”

1 个答案:

答案 0 :(得分:1)

似乎有点过时(as方法完全符合您的要求),但您可以

import org.apache.spark.sql.{Encoder, Dataset, DataFrame}

def convertTo[T : Encoder](df: DataFrame): Dataset[T] = df.as[T]

def convertTo[T](df: DataFrame)(implicit enc: Encoder[T]): Dataset[T] = df.as[T]

两种方法都是等价的,并且表达完全相同的东西(类型Encoder存在隐式T)。

如果你想避免使用隐式参数,你可以一直使用显式Encoder

def convertTo[T](df: DataFrame, enc: Encoder[T]): Dataset[T] = df.as[T](enc)

convertTo(df, encoderFor[Clicks])