2016-11-19 6 views
1

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

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] 

Оба метода эквивалентны и выражают точно то же самое (существование такого неявный Encoder для типа T).

Если вы хотите, чтобы избежать неявного параметра вы можете использовать явное Encoder весь путь вниз:

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

convertTo(df, encoderFor[Clicks]) 
Смежные вопросы