Как обрабатывать значения null при объединении значений типа карты в Spark

#scala #apache-spark #null

Вопрос:

Я пытаюсь объединить два столбца типа карты с помощью функции concat_map(). Моя проблема в том, что когда я пытаюсь соединить нуль и карту, я получаю нуль, когда ожидаю получить значение карты без значения.

 val DF_concatenated=    DF.select(col("_1"), map_concat(col("m2"),col("m3"))).show()
 

Я пытаюсь получить из этого фрейма данных DF:

  --- ---------- ---------------- 
| _1|        m2|              m3|
 --- ---------- ---------------- 
|  3|[c -> III]|            null|
|  1|  [a -> I]|     [one -> un]|
|  4|      null|[four -> quatre]|
|  2| [b -> II]|   [two -> deux]|
 --- ---------- ---------------- 
 

к этому кадру данных DF_concatenated:

  --- ---------------------- 
| _1|  map_concat(m2, m3)  |
 --- ---------------------- 
|  3|           [c -> III] |
|  1| [a -> I, one -> un]  |
|  4|    [four -> quatre]  |
|  2|[b -> II, two -> deux]|
 --- ---------------------- 
 
 

но в итоге у меня получается такой результат:

  --- ---------------------- 
| _1|  map_concat(m2, m3)  |
 --- ---------------------- 
|  3|                null  |
|  1| [a -> I, one -> un]  |
|  4|                null  |
|  2|[b -> II, two -> deux]|
 --- ---------------------- 
 

Ответ №1:

Поведение map_concat таково, что если даже один операнд равен нулю, он возвращает значение null.

Если ваши столбцы допускают значения null, вы можете использовать coalesce для замены значения null пустой картой.

 DF.select(
   col("_1"),
   map_concat(
       coalesce(col("m2"), map()),
       coalesce(col("m3"), map())
   ).as("result")
).show()