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两列就是不重复的数据

  • 相关阅读:
    Mysql:用户操作命令
    Cookie和Set-Cookie
    Matcher中appendReplacement()方法与replaceAll()方法的联系
    记录一次mysql执行异常(磁盘空间)
    ehcache简单配置
    md5
    mysql后台运行简单的备份脚本
    shell脚本研习
    SpringBoot根据条件,去注入需要的Bean
    springboot后台跨域设置
  • 原文地址:https://www.cnblogs.com/hejunhong/p/13926582.html
Copyright © 2011-2022 走看看