spark进行相同列的join时,只留下A与B关系,不要B与A

一、问题需求:

近期需要做一个商品集合的相关性计算,需要将所有商品进行两两组合笛卡尔积,但spark自带的笛卡尔积会造成过多重复,而且增加join量

假如商品集合里面有:

aa   aa

bb   bb

cc   cc

两两进行组合会出现九种情况

aa,aa

aa,bb

aa,cc

cc,aa

bb,aa

bb,cc

cc,aa

cc,bb

cc,cc

其实 aa,aa  还有aa,bb与bb,aa是一样的

我们其实只要其中3种:

 排列组合:

 

aa,bb

bb,  cc

aa, cc

二、实现:增加一列自增列

  //形成rdd
    val rdd = sc.parallelize(Array("bb", "aa", "cc", "dd"))
    //添加一列自增值
    val withIndexDf: DataFrame = rdd.zipWithIndex()
      .toDF("key", "index")

    withIndexDf.show(false)

+---+-----+
|key|index|
+---+-----+
|bb |0 |
|aa |1 |
|cc |2 |
|dd |3 |
+---+-----+

   //重命名一张表
    val df2 = withIndexDf.select(col("key").as("key2"), col("index").as("index2"))

    //只关联表二比表一大的
    val crossRdd = withIndexDf.join(df2, df2("index2") > withIndexDf("index"), "inner")
    crossRdd.show(false)

+---+-----+----+------+
|key|index|key2|index2|
+---+-----+----+------+
|bb |0 |aa |1 |
|bb |0 |cc |2 |
|bb |0 |dd |3 |
|aa |1 |cc |2 |
|aa |1 |dd |3 |
|cc |2 |dd |3 |
+---+-----+----+------+

得出 key与key2两列就是不重复的数据

原文地址:https://www.cnblogs.com/hejunhong/p/13926582.html