首页 > 解决方案 > 使用 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|
+------+-----+-------+

谁能帮我找出我应该用来检查相等性的正确字符串函数吗?

谢谢

标签: scalaapache-spark

解决方案


尽量避免使用 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|
+------+-----+------+

推荐阅读