Это работает, спасибо. Но с точки зрения эффективности это может быть довольно дорого со списком словаря 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 м строк).