如何将编码器作为参数传递给数据帧的 as 方法

Posted

技术标签:

【中文标题】如何将编码器作为参数传递给数据帧的 as 方法【英文标题】:How to pass Encoder as parameter to dataframe's as method 【发布时间】:2016-11-19 12:08:37 【问题描述】:

我想通过使用不同的案例类将 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】:

它似乎有点过时(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]

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

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

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

convertTo(df, encoderFor[Clicks])

【讨论】:

以上是关于如何将编码器作为参数传递给数据帧的 as 方法的主要内容,如果未能解决你的问题,请参考以下文章