Это работает, спасибо. Но с точки зрения эффективности это может быть довольно дорого со списком словаря 40K.

ольно новичок в scala и spark, и я весь день пытался найти решение этой проблемы - я в этом разбираюсь. Я попробовал 20 различных вариантов следующего кода и продолжаю получатьtype mismatch ошибки, когда я пытаюсь выполнить вычисления на столбце.

У меня есть спарк dataframe, и я хочу проверить, содержит ли каждая строка в определенном столбце любое количество слов из предопределенногоList (или жеSet) слов.

Вот некоторые примеры данных для репликации:

// sample data frame
val df = Seq(
      (1, "foo"),
      (2, "barrio"),
      (3, "gitten"),
      (4, "baa")).toDF("id", "words")

// dictionary Set of words to check 
val dict = Set("foo","bar","baaad")

Теперь я пытаюсь создать третий столбец с результатами сравнения, чтобы увидеть, если строки в$"words" столбец внутри них содержит любое из слов вdict Набор слов. Итак, результат должен быть:

+---+-----------+-------------+
| id|      words|   word_check| 
+---+-----------+-------------+
|  1|        foo|         true|     
|  2|      bario|         true|
|  3|     gitten|        false|
|  4|        baa|        false|
+---+-----------+-------------+

Во-первых, я попытался выяснить, смогу ли я сделать это изначально, не используя UDF, так как набор dict на самом деле будет большим словарем из> 40 КБ слов, и, насколько я понимаю, это будет более эффективно, чем UDF:

df.withColumn("word_check", dict.exists(d => $"words".contains(d)))

Но я получаю ошибку:

type mismatch;
found   : org.apache.spark.sql.Column
required: Boolean

Я также пытался создать UDF для этого (используя обаmutable.Set а такжеmutable.WrappedArray описать набор - не уверен, что правильно, но не работает):

val checker: ((String, scala.collection.mutable.Set[String]) => Boolean) = (col: String, array: scala.collection.mutable.Set[String] ) =>  array.exists(d => col.contains(d))

val udf1 = udf(checker)

df.withColumn("word_check", udf1($"words", dict )).show()

Но получите другое несоответствие типов:

 found   : scala.collection.immutable.Set[String]
 required: org.apache.spark.sql.Column

Если бы набор был фиксированным номером, я мог бы использоватьLit(Int) в выражении? Но я не совсем понимаю, как выполнять более сложные функции для столбца, смешивая разные типы данных в scala.

Любая помощь очень ценится, особенно если это может быть сделано эффективно (это большой df> 5 м строк).

Ответы на вопрос(1)

Ваш ответ на вопрос