【问题标题】:Alias inner join in pyspark别名内部加入pyspark
【发布时间】:2020-12-25 13:44:21
【问题描述】:

我正在连接两个具有相同名称和值的数据框。

数据是:

+----------------+------------------+
|id              |name              |
+----------------+------------------+
|2               |G2                |
|1               |H2                |
|2               |H2                |
|1               |G2                |
+----------------+------------------+

代码是:

 res = data.alias(
            "C1"
        ).join(
            data.alias(
                "C2"
            ),
            on='id',
            how="inner"
        ).select(
            F.col("C1.{0}".format(name)).alias("C1"),
            F.col("C2.{0}".format(name)).alias("C2"),
            'id'
        )

我得到的结果是:

+----+----+----------------+
|C1  |C2  |id              |
+----+----+----------------+
|G2  |H2  |2               |
|G2  |G2  |2               |
|H2  |G2  |1               |
|H2  |H2  |1               |
|H2  |H2  |2               |
|H2  |G2  |2               |
|G2  |G2  |1               |
|G2  |H2  |1               |
+----+----+----------------+

而对于内部连接,我期望结果为:

+----------------+------------------+
|id              |C1  |   C2        |
+----------------+------------------+
|2               |G2   | G2         |
|1               |H2   | H2         |
|2               |H2   | H2         |
|1               |G2   | G2         |
+----------------+------------------+

为什么我得到的结果是 8 行而不是上述 4 行的联合。

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    内连接将匹配两个表中满足给定条件的所有行对。您要求在 id 匹配时加入行,因此第一行将同时匹配第一行和第三行,从而在结果数据框中给出两个对应的行。同样,所有其他行将匹配具有相同 id 的另外两行,所以最后你得到了 8 行。

    如果您想要获得预期的结果,则不需要连接 - 只需使用 res = data.withColumn("C2", data["C1"])) 将列 C1 复制到 C2。

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      相关资源
      最近更新 更多