манипуляции со строками с использованием Spark scala - PullRequest
0 голосов
/ 07 марта 2020

У меня есть следующий Spark scala dataframe.

val someDF = Seq(
  (1, "bat",1.3222),
  (4, "cbat",1.40222),
  (3, "horse",1.501212)
).toDF("number", "word","value")

Я создал пользовательскую функцию (UDF) для создания новой переменной следующим образом:

Logi c: если слова равны 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|
+------+-----+-------+

Может кто-нибудь помочь мне выяснить правильную строковую функцию, которую я должен использовать, чтобы проверить равенство?

Спасибо

Ответы [ 2 ]

4 голосов
/ 07 марта 2020

Старайтесь избегать использования 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|
+------+-----+------+
0 голосов
/ 07 марта 2020

Решение заключается в использовании метода equals вместо contains. contains проверяет, присутствует ли строка bat где-либо в данной строке s, а не равенство. Код показан ниже:

scala> someDF.show
+------+-----+--------+
|number| word|   value|
+------+-----+--------+
|     1|  bat|  1.3222|
|     4| cbat| 1.40222|
|     3|horse|1.501212|
+------+-----+--------+


scala> import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions._

scala> val func1 = udf( (s:String ,y:Double) => if(s.equals("bat")) y else 0 )
func1: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function2>,DoubleType,Some(List(StringType, DoubleType)))

scala> someDF.withColumn("col_var", func1(col("word"),col("value"))).drop("value").show
+------+-----+-------+
|number| word|col_var|
+------+-----+-------+
|     1|  bat| 1.3222|
|     4| cbat|    0.0|
|     3|horse|    0.0|
+------+-----+-------+

Дайте мне знать, если это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...