【问题标题】:How to drop duplicates from a cartesian product in spark如何从火花中的笛卡尔积中删除重复项
【发布时间】:2021-07-16 01:06:06
【问题描述】:

我创建了一组单词的交叉连接,以比较它们在 Spark 中的相似性。但是,我试图摆脱那些自(word1,word2)=(word2,word1)的分数以来重复的条目。我的下表看起来像这样;

+-------+-------+-------+
|  col1 | col2  | score |
+-------+-------+-------+
| word1 | word1 |   1   |
| word1 | word2 | 0.345 |
| word1 | word3 | 0.432 |
| word2 | word1 | 0.345 |
| word2 | word2 |   1   |
| word2 | word3 | 0.543 |
| word3 | word1 | 0.432 |
| word3 | word2 | 0.543 |
| word3 | word3 |   1   |
+-------+-------+-------+

理想情况下,我希望获得这样的结果:不重复比较:

+-------+-------+-------+
|  col1 | col2  | score |
+-------+-------+-------+
| word1 | word1 |   1   |
| word1 | word2 | 0.345 |
| word1 | word3 | 0.432 |
| word2 | word2 |   1   |
| word2 | word3 | 0.543 |
| word3 | word3 |   1   |
+-------+-------+-------+

【问题讨论】:

    标签: apache-spark pyspark cross-join


    【解决方案1】:

    col1col2 组合为一个列表,并使用sort_array 按字母顺序对它们进行排序。排序后,对它们执行.distinct() 将删除重复项。现在您可以将列表解压缩为col1col2

    from pyspark.sql import functions as F
    from pyspark.sql.functions import sort_array
    
    df.withColumn("sorted_list", sort_array(F.array([F.col("col1"), F.col("col2")])))\
        .select("sorted_list", "score").distinct()\
        .select(F.col("sorted_list")[0].alias("col1"), \
        F.col("sorted_list")[1].alias("col2"), "score").show()
    

    输出:

    +-----+-----+-----+
    | col1| col2|score|
    +-----+-----+-----+
    |word1|word1|  1.0|
    |word1|word2|0.345|
    |word1|word3|0.432|
    |word2|word2|  1.0|
    |word2|word3|0.543|
    |word3|word3|  1.0|
    +-----+-----+-----+
    

    【讨论】:

    • 太好了,非常感谢,我已经解决这个问题一个多星期了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2012-02-24
    • 2011-09-18
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多