Как согласиться с условием в кадре данных Spark? - PullRequest
0 голосов
/ 05 мая 2018

Например, необработанный кадр данных выглядит следующим образом:

+--------+--------+
|    col1|    col2|
+--------+--------+
|    null|       A|
|       B|    null|
|       C|       D|
|    null|    null|
+--------+--------+

Я хочу объединить col1 и col2, чтобы получить следующий фрейм данных:

+--------+--------+-------------------+
|    col1|    col2|               col3|
+--------+--------+-------------------+
|    null|       A|         "{col2:A}"|
|       B|    null|         "{col1:B}"|
|       C|       D| "{col1:C, col2:D}"|
|    null|    null|               "{}"|
+--------+--------+-------------------+

Новый col3 объединяется с ненулевым col1 и ненулевым col2. И col3 является строковым типом. Как добавить нулевое условие в метод concat?

1 Ответ

0 голосов
/ 05 мая 2018

Вы можете объединить столбцы в массив

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

val  df = Seq((null, "A"), ("B", null), ("C", "D"), (null, null)).toDF("colA", "colB")

val cols = array(df.columns.map(c =>
  // If column is not null, merge it with its name otherwise null
  when(col(c).isNotNull, concat_ws(":", lit(c), col(c)))): _*
)

и используйте UserDefinedFunction

val combine = udf((xs: Seq[String]) => {
   val tmp = xs.filter { _ != null }.mkString(",")
   s"{$tmp}"
})

df.withColumn("col3", combine(cols)).show
// +----+----+---------------+
// |colA|colB|           col3|
// +----+----+---------------+
// |null|   A|       {colB:A}|
// |   B|null|       {colA:B}|
// |   C|   D|{colA:C,colB:D}|
// |null|null|             {}|
// +----+----+---------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...