在spark中拆分列并将空值转换为null

irlmq6kh  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(360)

在spark中拆分列时,我试图将空值填充为null。例子:

| A        |
| 1.2.3    |
| 4..5     |

我在找:
aa分体式1a分体式2a分体式31.2.31234..545
我得到了:
aa分体式1a分体式2a分体式31.2.31234..545
我的代码是:

df.withColumn("A", when(split(col("A"), "\\.") =!= lit(""), split(col("A"), "\\."))

但是,我得到了一个错误,因为类型不匹配:
数组(字符串)不是字符串。
不使用自定义项就可以找到解决方案吗?
非常感谢

kx1ctssn

kx1ctssn1#

当获取列使用的数组项时,可以拆分 when 如果元素为空,则更改为null:

// n is the max array size from split (in your example it's 3)
val n = 3

val df1 = df.withColumn(
    "ASplit",
    split(col("A"), "[.]")
  ).select(
    Seq(col("A")) ++ (0 to n-1).map(i =>
      when(col("ASplit")(i) === "", lit(null)).otherwise(col("ASplit")(i)).as(s"A split $i")
    ): _*
  )

//+-----+---------+---------+---------+
//|    A|A split 0|A split 1|A split 2|
//+-----+---------+---------+---------+
//|1.2.3|        1|        2|        3|
//| 4..5|        4|     null|        5|
//+-----+---------+---------+---------+
b0zn9rqh

b0zn9rqh2#

你可以 transform 通过将空值替换为空值来获得拆分结果:

val result = df.withColumn(
    "split",
    expr("transform(split(A, '\\\\.'), x -> case when x = '' then null else x end)")
).select($"A", $"split"(0), $"split"(1), $"split"(2))

result.show
+-----+--------+--------+--------+
|    A|split[0]|split[1]|split[2]|
+-----+--------+--------+--------+
|1.2.3|       1|       2|       3|
| 4..5|       4|    null|       5|
+-----+--------+--------+--------+

相关问题