如何在单个表上执行 GROUP BY 并将该表与另一个表连接?
Posted
技术标签:
【中文标题】如何在单个表上执行 GROUP BY 并将该表与另一个表连接?【英文标题】:How to perform GROUP BY on single table and join that table with another table? 【发布时间】:2021-11-30 17:33:16 【问题描述】:我有两张桌子:
表1:
Row1 | Row2 | Common |
---|---|---|
x1 | y1 | c1 |
x2 | y2 | c2 |
x3 | y3 | c3 |
表2:
Common | Value | Other |
---|---|---|
c1 | 5 | p1 |
c1 | 6 | p2 |
c1 | 10 | p3 |
c2 | 22 | p4 |
c2 | 14 | p5 |
c3 | 6 | p6 |
c3 | 21 | p7 |
c3 | 11 | p8 |
需要根据这些连接这两个表:
首先需要使用公共列的 max(Value) 组从 Table2 中创建一个临时表,即:
Common | Value | Other |
---|---|---|
c1 | 10 | p3 |
c2 | 22 | p4 |
c3 | 21 | p7 |
然后我需要将这个临时表与 Table1 加入即:
Row1 | Row2 | Common | Value | Other |
---|---|---|---|---|
x1 | y1 | c1 | 10 | p3 |
x2 | y2 | c2 | 22 | p4 |
x3 | y3 | c3 | 21 | p7 |
现在,我需要在 PySpark 上实现它。
我用过这个sn-p:
import pyspark.sql.functions as f
Table1.alias("T1").join(
Table2.alias("T2"),
(col("T1.Common") == col("T2.Common") & col("T2.Value") == T2.groupBy('Common').agg(f.max('Value'))),
"left",
)
但它失败了。
我应该做些什么改变?
基本上,我需要编写这个 sql 查询的代码来制作那个临时表:
SELECT *
FROM Table2
WHERE Value IN(
SELECT max(Value)
FROM Table2
GROUP BY Common);
【问题讨论】:
先为 Table2 创建一个临时 df,然后将该 df 与 Table1 连接会更好吗? 是否需要为最大Value
的行保留Other
列的值?此外,您似乎应该使用 F.col
而不是 col
,除非它已在其他地方导入。
是的,我需要保留其他列的值。
Value
栏可以有联系吗?多行最大值相同怎么办?
在表 2 中,只有一个“通用”数据(即 C1 或 C2)的“值”列将没有关联。因此,“其他”列中的两个数据之间也没有联系。
【参考方案1】:
您应该首先创建临时表并将其传递给连接。此外,如果您只是加入列值,传入列名列表将自动将 2 个表的列合并为一个,因此您无需为它们设置别名。
max_val = Table2.groupby("Common").agg(f.max("Value").alias("Value")).join(Table2, on=["Common", "Value"])
result_df = Table1.join(max_val, on=["Common"])
result_df.orderBy("Common").show()
+------+----+----+-----+-----+
|Common|Row1|Row2|Value|Other|
+------+----+----+-----+-----+
| c1| x1| y1| 10| p3|
| c2| x2| y2| 22| p4|
| c3| x3| y3| 21| p7|
+------+----+----+-----+-----+
【讨论】:
以上是关于如何在单个表上执行 GROUP BY 并将该表与另一个表连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何将一个表与另一个表连接,然后计算非空列并将它们按另外两个字段分组?
如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?