包含字符串列表中确切字符串的文本

时间:2019-10-31 23:55:51

标签: scala apache-spark apache-spark-sql pattern-matching contains

我正在尝试在给定的关键字列表中查找包含至少一个关键字的所有文本。 这类似于以下答案:String Containing Exact Substring from Substring List

但是,我需要对其进行扩展,以便它可以使用多个单词,例如匹配“美国”而不是简单的“美国”。


val df = spark.createDataFrame(Seq(
  (1, "usa of america"),
  (2, "usa"),
  (4, "united states of america"),
  (5, "states"),
  (6, "united states")
)).toDF("id", "country")
df.registerTempTable("df")

val valid_names = Set("usa", "united states")

def udf_check_country(valid_words: Set[String]) = {  udf {(words: String) => words.split(" ").exists(valid_words.contains) } }

var df2 = df.withColumn("udf_check_country", udf_check_country(valid_names)($"country"))
df2.registerTempTable("df2")

df2.show()


在最后一例“美国”中,新列出现故障的地方。


+---+--------------------+-----------------+
| id|             country|udf_check_country|
+---+--------------------+-----------------+
|  1|      usa of america|             true|
|  2|                 usa|             true|
|  4|united states of ...|            false|
|  5|              states|            false|
|  6|       united states|            false|
+---+--------------------+-----------------+

如何使其适用于包含多个单词的关键字?

1 个答案:

答案 0 :(得分:0)

根据您的规则,您可以简单地添加另一个条件,以对整个字符串迭代valid_names,例如:

valid_words.exists(words.contains) || words.split(" ").exists(valid_words.contains)

这将使id 4和6也返回true