Spark scala: Как разложить код на столбцы? - PullRequest
0 голосов
/ 07 января 2020

Мне нужно объединить две таблицы и создать новые столбцы. Код является избыточным. Как я могу учесть это с UDF в Spark / Scala.




val finaldf : DataFrame =  tableA.join(tableB, col("A_val") === col("B_val"), "left_outer")
.withColumn ("D1", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D1"))
  .otherwise(col("A_D1")))
.withColumn ("D2", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D2"))
  .otherwise(col("A_D2")))
.withColumn ("D3", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D3"))
.otherwise(col("A_D3")))
.withColumn ("D4", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D4"))
.otherwise(col("A_D4")))
.withColumn ("D5", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D5"))
.otherwise(col("A_D5")))
.withColumn ("D6", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D6"))
.otherwise(col("A_D6")))
.withColumn ("D7", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D7"))
.otherwise(col("A_D7")))
.withColumn ("D8", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D8"))
.otherwise(col("A_D8")))
.withColumn ("D9", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D9"))
.otherwise(col("A_D9")))
.withColumn ("D10", when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D10"))
.otherwise(col("A_D10")))

Спасибо за ваш ответ

1 Ответ

0 голосов
/ 07 января 2020

Ниже мое решение. Вкратце, он создает серии столбцов, а затем выбирает их после объединения.

import org.apache.spark.sql.functions._
val finaldf : DataFrame =  tableA.join(tableB, col("A_val") === col("B_val"), "left_outer")
// create 10 columns 
val cols = (1 to 10).map(s => when(col("A_val").isNotNull && col("B_val").isNotNull, col("B_D"+s))
          .otherwise(col("A_D"+s)))
val dfCols = finaldf.columns.map(col) ++ cols
// select original columns and newly created columns
val df = finaldf.select(dfCols:_*)
...