【问题标题】:How to define spark dataframe join match priority如何定义火花数据框连接匹配优先级
【发布时间】:2019-03-19 04:47:56
【问题描述】:

我有两个数据框。

数据DF

+---+
| tt|
+---+
|  a|
|  b|
|  c|
| ab|
+---+

改变

+----+-----+------+
|name|alter|profit|
+----+-----+------+
|   a|   aa|     1|
|   b|    a|     5|
|   c|   ab|     8|
+----+-----+------+

任务是在数据框alter col(“name”)中搜索col“tt”,如果找到加入他们,如果没有找到,则在col(“alter”)中搜索col“tt”。 col("name") 的优先级高于 col("alter")。这意味着如果 col("tt") 的行与 col("name") 匹配,我不想将它与仅匹配 col("alter") 的其他行匹配。我怎样才能完成这项任务?

我试图写一个连接,但它不起作用。

dataDF = dataDF.select("*")
      .join(broadcast(alterDF),
       col("tt") === col("Name") || col("tt") === col("alter"),
        "left")

结果是:

+---+----+-----+------+
| tt|name|alter|profit|
+---+----+-----+------+
|  a|   a|   aa|     1|
|  a|   b|    a|     5|   // this row is not expected. 
|  b|   b|    a|     5|
|  c|   c|   ab|     8|
| ab|   c|   ab|     8|
+---+----+-----+------+

【问题讨论】:

    标签: apache-spark dataframe join


    【解决方案1】:

    您可以尝试加入两次。第一次用name列,过滤掉数据不匹配的tt值,加入alter列。联合两者的结果。请在下面找到相同的代码。希望对您有所帮助。

    //Creating Test Data
    val dataDF = Seq("a", "b", "c", "ab").toDF("tt")
    
    val alter = Seq(("a", "aa", 1), ("b", "a", 5), ("c", "ab", 8))
        .toDF("name", "alter", "profit")
    
    val join1 = dataDF.join(alter, col("tt") === col("name"), "left")
    
    val join2 = join1.filter( col("name").isNull).select("tt")
      .join(alter, col("tt") === col("alter"), "left")
    
    val joinDF = join1.filter( col("name").isNotNull).union(join2)
    
    joinDF.show(false)
    
    +---+----+-----+------+
    |tt |name|alter|profit|
    +---+----+-----+------+
    |a  |a   |aa   |1     |
    |b  |b   |a    |5     |
    |c  |c   |ab   |8     |
    |ab |c   |ab   |8     | 
    +---+----+-----+------+
    

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2019-12-01
      • 2021-04-26
      • 2011-01-31
      • 1970-01-01
      • 2021-08-02
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多