scala - 使用 Spark scala 进行字符串操作
问题描述
我有以下 Spark scala 数据框。
val someDF = Seq(
(1, "bat",1.3222),
(4, "cbat",1.40222),
(3, "horse",1.501212)
).toDF("number", "word","value")
我创建了一个用户定义函数 (UDF) 来创建一个新变量,如下所示:
逻辑:如果 words 等于 bat 然后值为零。
import org.apache.spark.sql.functions.{col}
val func1 = udf( (s:String ,y:Double) => if(s.contains("bat")) y else 0 )
func1(col("word"),col("value"))
+------+-----+-------+
|number| word|cal_var|
+------+-----+-------+
| 1| bat| 1.3222|
| 4| cbat|1.40222|
| 3|horse| 0.0|
+------+-----+-------+
在这里检查我使用contains
函数的相等性。因此,我得到了不正确的输出。我想要的输出应该是这样的:
+------+-----+-------+
|number| word|cal_var|
+------+-----+-------+
| 1| bat| 1.3222|
| 4| cbat| 0.0|
| 3|horse| 0.0|
+------+-----+-------+
谁能帮我找出我应该用来检查相等性的正确字符串函数吗?
谢谢
解决方案
尽量避免使用 UDF,因为它的性能很差,
另一种方法:
val someDF = Seq(
(1, "bat",1.3222),
(4, "cbat",1.40222),
(3, "horse",1.501212)
).toDF("number", "word","value")
import org.apache.spark.sql.functions._
someDF.show
+------+-----+--------+
|number| word| value|
+------+-----+--------+
| 1| bat| 1.3222|
| 4| cbat| 1.40222|
| 3|horse|1.501212|
+------+-----+--------+
someDF.withColumn("value",when('word === "bat",'value).otherwise(0)).show()
+------+-----+------+
|number| word| value|
+------+-----+------+
| 1| bat|1.3222|
| 4| cbat| 0.0|
| 3|horse| 0.0|
+------+-----+------+
推荐阅读
- c - 如何从“/proc/[pid]/status”文件夹中计算 C 中进程的内存使用量?
- reactjs - 重定向到 https 安全在 react-router 中不起作用
- jenkins - 如何将参数传递到管道脚本但不使其成为詹金斯 UI 中的参数化构建
- python - 嵌套 for 循环的递归替代方案
- swift - Swift SKPhysicsBody 空子类不继承父初始化
- bash - 如果存在单词,如何替换世界,否则使用 sed 在行尾附加一个单词
- python - 归并排序递归版本直觉落后
- wifi - 通过 WiFi 将数据从 ESP32 发送到服务器
- vue.js - 当我尝试安装使用 yarn add ../library 创建到我的应用程序的本地 vue js 库时,找不到依赖项
- node.js - 为什么我在 S3 中的图像保存为字符(����94qgs��jX����z)而不是图像?