使用 Spark Dataframe 以与重复项相反的顺序删除相同的单词
Dropping same words in reverse order as duplicates using Spark Dataframe
我能够使用 Spark Dataframe
方法 dropDuplicates
成功删除重复项,该方法将 100% 完全匹配的匹配项视为重复项。因此,例如,如果我们有两个 "red toys"
,其中一个被认为是重复的并被过滤掉。
现在新要求说,我们需要将相同的单词倒序也视为重复。所以参考上面的例子,如果我们有 "red toys"
和 "toys red"
,它们将被认为是重复的,应该被删除。此要求仅适用于 2 个单词的短语。
有人可以在 Spark
中建议为此采取的方法吗?另外,想知道这是否是 Machine Learning
或 NLP
.
的用例
最直接的解决方案是将句子拆分为单词数组,对数组进行排序,然后根据这个新列删除重复项。
在 Spark 2.4.0+ 中,这可以使用 array_sort
and split
完成,如下所示:
df.withColumn("arr", array_sort(split($"words", " ")))
.dropDuplicates("arr")
如果需要,可以用 .drop(arr)
删除新的 arr
列。
使用较旧的 Spark 版本,或者如果需要使用 更复杂的逻辑(例如,仅考虑两个单词短语进行反向删除) ,需要使用 UDF
。例如,要只考虑两个单词短语,我们可以使用:
val sort_udf = udf((arr: Seq[String]) => {
if (arr.size == 2) arr.sorted else arr
})
df.withColumn("arr", sort_udf(split($"words", " ")))
.dropDuplicates("arr")
我能够使用 Spark Dataframe
方法 dropDuplicates
成功删除重复项,该方法将 100% 完全匹配的匹配项视为重复项。因此,例如,如果我们有两个 "red toys"
,其中一个被认为是重复的并被过滤掉。
现在新要求说,我们需要将相同的单词倒序也视为重复。所以参考上面的例子,如果我们有 "red toys"
和 "toys red"
,它们将被认为是重复的,应该被删除。此要求仅适用于 2 个单词的短语。
有人可以在 Spark
中建议为此采取的方法吗?另外,想知道这是否是 Machine Learning
或 NLP
.
最直接的解决方案是将句子拆分为单词数组,对数组进行排序,然后根据这个新列删除重复项。
在 Spark 2.4.0+ 中,这可以使用 array_sort
and split
完成,如下所示:
df.withColumn("arr", array_sort(split($"words", " ")))
.dropDuplicates("arr")
如果需要,可以用 .drop(arr)
删除新的 arr
列。
使用较旧的 Spark 版本,或者如果需要使用 更复杂的逻辑(例如,仅考虑两个单词短语进行反向删除) ,需要使用 UDF
。例如,要只考虑两个单词短语,我们可以使用:
val sort_udf = udf((arr: Seq[String]) => {
if (arr.size == 2) arr.sorted else arr
})
df.withColumn("arr", sort_udf(split($"words", " ")))
.dropDuplicates("arr")