首页 > 解决方案 > 火花中带有零的前缀列

问题描述

我正在创建一个新的属性 x,其中包含属性 a + b + c 的串联。如果 x 的总长度小于 10,那么我只想在属性 c 前加上 0。我该怎么做?

val x = when length(concat($"a", $"b", $"c")) < 10, 
        concat($"a", $"b", lpad($"c", 10, '0'))
       .otherwise(concat($"a", $"b", $"c"))

以上将不起作用,因为 c 列将以 0 为前缀,直到长度为 10,而我希望 concat 之后的总长度为 10。请建议。

标签: scalaapache-spark

解决方案


您可以使用 sql 表达式lpad

val df =Seq(("aaa","bbb","cccc"),
  ("a","b","c"),
  ("a","b","1234567890123"),
  ("a","b","")).toDF("a","b","c")

df.withColumn("x", when(length(concat($"a",$"b",$"c")) < 10,
  concat($"a", $"b", expr("lpad(c, 10 - char_length(a) - char_length(b), '0')")))
  .otherwise(concat($"a",$"b",$"c")))
  .show()

输出:

+---+---+-------------+---------------+
|  a|  b|            c|              x|
+---+---+-------------+---------------+
|aaa|bbb|         cccc|     aaabbbcccc|
|  a|  b|            c|     ab0000000c|
|  a|  b|1234567890123|ab1234567890123|
|  a|  b|             |     ab00000000|
+---+---+-------------+---------------+

推荐阅读