Spark中拼接MapType类型值时如何处理Null值
解决Spark中map_concat处理Null与Map拼接返回Null的问题
我之前也碰到过这个问题,map_concat的设计逻辑是只要传入的参数中有任意一个为Null,就会直接返回Null,这就是你遇到Null和非Null Map拼接时得到Null的原因。要实现你想要的效果,核心思路是把Null值替换成空的Map,这样空Map和非空Map拼接的结果就是那个非空的Map。
下面给你两种可行的解决方案:
方案一:使用coalesce函数(推荐)
coalesce函数会返回传入参数中第一个非Null的值,我们可以用它把Null的Map替换成空Map:
import org.apache.spark.sql.functions.{col, map_concat, coalesce, lit} // 注意:这里的空Map类型要和你原DataFrame中的Map类型一致,示例是String->String类型 val emptyStringMap = lit(Map.empty[String, String]) val DF_concatenated = DF.select( col("_1"), map_concat( coalesce(col("m2"), emptyStringMap), coalesce(col("m3"), emptyStringMap) ).alias("map_concat(m2, m3)") ).show()
方案二:使用when条件判断
如果更习惯用条件分支处理,也可以用when函数显式判断Null并替换:
import org.apache.spark.sql.functions.{col, map_concat, when, lit} val emptyStringMap = lit(Map.empty[String, String]) val DF_concatenated = DF.select( col("_1"), map_concat( when(col("m2").isNull, emptyStringMap).otherwise(col("m2")), when(col("m3").isNull, emptyStringMap).otherwise(col("m3")) ).alias("map_concat(m2, m3)") ).show()
这两种方案都能让你得到期望的结果:当其中一个Map为Null时,直接保留另一个非Null的Map;当两个都非Null时,正常拼接它们的键值对。
内容的提问来源于stack exchange,提问作者Ben Smida Dali
相关产品推荐
相关产品推荐

