zoukankan      html  css  js  c++  java
  • 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两列就是不重复的数据

  • 相关阅读:
    (八)shell 计算命令
    (七)shell内建命令
    (六)shell数组深入解析
    (五)shell字符串深入解析
    输出链表的倒数第K个值
    反转链表
    调整该数组中数字的顺序,奇数在前,偶数在后
    基类与派生类的对象调用
    printf以%d形式输出浮点数的问题
    数值的整数次方
  • 原文地址:https://www.cnblogs.com/hejunhong/p/13926582.html
Copyright © 2011-2022 走看看