Применение сложного преобразования настраиваемым способом с использованием функции scala и фрейма данных spark

#scala #apache-spark

Вопрос:

Как реализовать сложное преобразование настраиваемым способом . Я получаю данные в файле, скажем, csv, avro и т. Д., Которые останутся прежними, и благодаря этому я создам фрейм данных, Теперь мне нужно написать другую функцию, имеющую другую логику преобразования. используя spark scala, который будет применен к фрейму данных . На основе параметра , который мы передаем с помощью файла конфигурации, конкретная функция будет выполнена с требуемым преобразованием

Параметр, который мы будем передавать через конфигурацию, которая выберет соответствующую функцию, Любые входные данные для реализации этого, пожалуйста

Ответ №1:

Это можно сделать с помощью transform функции в spark.

Начните с определения функций для выполнения преобразований.

 import org.apache.spark.sql.functions._
import org.apache.spark.sql.DataFrame

def addOne(df: DataFrame) = {
  df.withColumn("plusOne", df("col")   1)
}

def addTwo(df: DataFrame) = {
  df.withColumn("plusTwo", df("col")   2)
}
 

Затем определите тестовый фрейм данных

 val test = (1 to 10).toDF("col")
test.show(3, false)

/* outputs:

 --- 
|col|
 --- 
|1  |
|2  |
|3  |
 --- 
*/
 

Затем используйте функцию «преобразование», чтобы выполнить фактические преобразования на основе вашего параметра в конфигурации.

 val parameter = 1
val result1 = parameter match {
  case 1 => test.transform(addOne)
  case 2 => test.transform(addTwo)
}

result1.show(3, false)

/*
 --- ------- 
|col|plusOne|
 --- ------- 
|1  |2      |
|2  |3      |
|3  |4      |
 --- ------- 
*/
 

В случае parameter , если это другое значение, вы можете увидеть, как оно будет вести себя ниже.

 
val parameter = 2

// below code can be extracted into a function
val result2 = parameter match {
  case 1 => test.transform(addOne)
  case 2 => test.transform(addTwo)
}

result2.show(3, false)

/*
Outputs:

 --- ------- 
|col|plusTwo|
 --- ------- 
|1  |3      |
|2  |4      |
|3  |5      |
 --- ------- 

*/