scala - 火花中带有零的前缀列
问题描述
我正在创建一个新的属性 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。请建议。
解决方案
您可以使用 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|
+---+---+-------------+---------------+
推荐阅读
- python - 如何在打印函数中将两个整数放在一起而不在 python 中添加它们?
- python - Webscrape 当前的 chrome 选项卡
- docker - 如何停止 Kubernetes 中从 docker 镜像运行的 Confluence 应用程序?
- .htaccess - 如何为 301 重定向创建 htaccess 重写规则
- python - 是否可以绘制出 PySpark 中列之间的依赖关系?
- javascript - Puppeteer - 从框架集中的第 5 级深子页面调用外部 JS 函数
- r - 来自函数的消息被多次重复
- python-3.x - 如何冻结循环中的迭代以打印python
- c++ - 向量 c++ 中的对象
- keras - 如何在 Keras/Openvino 模型中跳过一层