Как передать кодировщик как параметр в метод фрейма данных как

Я хочу преобразовать dataFrame в dataSet, используя другой класс case. Теперь мой код выглядит так, как показано ниже.

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

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

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

Итак, мой вопрос: «Могу ли я каким-либо образом использовать одну общую функцию для этой функции, передав класс case в качестве дополнительного параметра этой функции?»




Ответы (1)


Это кажется немного устаревшим (метод as делает именно то, что вы хотите), но вы можете

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

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

or

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])
person zero323    schedule 19.11.2016