根据相等的列值添加另一列

发布于 2025-01-11 09:25:20 字数 551 浏览 0 评论 0原文

PySpark:可能是重复的,找不到类似的问题。

我有一个表 A:

a | b | c
---------
1 | 3 | p
2 | 4 | q
3 | 4 | r
4 | 7 | s

和一个表 B:

p | q
---------
1 | Yes
2 | No
3 | Yes

我希望将结果表连接到列 a 值等于列 p 值。我尝试了内部联接,但它为每个 q 值返回整个表 A 的副本。我希望结果表为:

a | b | c | q
--------------
1 | 3 | p | Yes
2 | 4 | q | No
3 | 4 | r | Yes

请帮助了解如何在 PySpark 中实现此目的?另外,如果我想要这张桌子,我该怎么办:

a | b | c | q
--------------
1 | 3 | p | Yes
2 | 4 | q | No
3 | 4 | r | Yes
4 | 7 | s | null

PySpark: Possibly a duplicate, can't find a similar question.

I have a table A:

a | b | c
---------
1 | 3 | p
2 | 4 | q
3 | 4 | r
4 | 7 | s

And a table B:

p | q
---------
1 | Yes
2 | No
3 | Yes

I want the resultant table to be joined on column a value being equal to column p value. I tried the inner join, but it returns a copy of the entire table A for each q value. I want the resultant table to be:

a | b | c | q
--------------
1 | 3 | p | Yes
2 | 4 | q | No
3 | 4 | r | Yes

Please help out with how to achieve this in PySpark? And also, what do I do if I wanted this table:

a | b | c | q
--------------
1 | 3 | p | Yes
2 | 4 | q | No
3 | 4 | r | Yes
4 | 7 | s | null

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦明 2025-01-18 09:25:20

您可以使用两个 DataFrames 之间的 join 语句轻松地完成此操作。

可以找到有关联接的更多信息 - Spark 连接

数据准备

df1 = pd.read_csv(StringIO("""
a|b|c
1|3|p
2|4|q
3|4|r
4|7|s
"""),delimiter='|')

df2 = pd.read_csv(StringIO("""
p|q
1|Yes
2|No
3|Yes
"""),delimiter='|')


sparkDF1 = sql.createDataFrame(df1)
sparkDF2 = sql.createDataFrame(df2)

sparkDF1.show()

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  3|  p|
|  2|  4|  q|
|  3|  4|  r|
|  4|  7|  s|
+---+---+---+

sparkDF2.show()

+---+---+
|  p|  q|
+---+---+
|  1|Yes|
|  2| No|
|  3|Yes|
+---+---+

连接 - 内

finalDF = sparkDF1.join(sparkDF2
                        ,sparkDF1['a'] == sparkDF2['p'] ### Joining Key
                        ,'inner' ### Join Type
                    ).select(sparkDF1['*'],sparkDF2['q'])


finalDF.orderBy('a').show()

+---+---+---+---+
|  a|  b|  c|  q|
+---+---+---+---+
|  1|  3|  p|Yes|
|  2|  4|  q| No|
|  3|  4|  r|Yes|
+---+---+---+---+

连接 - 左

finalDF = sparkDF1.join(sparkDF2
                        ,sparkDF1['a'] == sparkDF2['p']
                        ,'left'
                    ).select(sparkDF1['*'],sparkDF2['q'])


finalDF.orderBy('a').show()

+---+---+---+----+
|  a|  b|  c|   q|
+---+---+---+----+
|  1|  3|  p| Yes|
|  2|  4|  q|  No|
|  3|  4|  r| Yes|
|  4|  7|  s|null|
+---+---+---+----+

You can easily do this with a join statement between the two DataFrames

More Information on Joins can be found - Spark Joins

Data Preparation

df1 = pd.read_csv(StringIO("""
a|b|c
1|3|p
2|4|q
3|4|r
4|7|s
"""),delimiter='|')

df2 = pd.read_csv(StringIO("""
p|q
1|Yes
2|No
3|Yes
"""),delimiter='|')


sparkDF1 = sql.createDataFrame(df1)
sparkDF2 = sql.createDataFrame(df2)

sparkDF1.show()

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  3|  p|
|  2|  4|  q|
|  3|  4|  r|
|  4|  7|  s|
+---+---+---+

sparkDF2.show()

+---+---+
|  p|  q|
+---+---+
|  1|Yes|
|  2| No|
|  3|Yes|
+---+---+

Join - Inner

finalDF = sparkDF1.join(sparkDF2
                        ,sparkDF1['a'] == sparkDF2['p'] ### Joining Key
                        ,'inner' ### Join Type
                    ).select(sparkDF1['*'],sparkDF2['q'])


finalDF.orderBy('a').show()

+---+---+---+---+
|  a|  b|  c|  q|
+---+---+---+---+
|  1|  3|  p|Yes|
|  2|  4|  q| No|
|  3|  4|  r|Yes|
+---+---+---+---+

Join - Left

finalDF = sparkDF1.join(sparkDF2
                        ,sparkDF1['a'] == sparkDF2['p']
                        ,'left'
                    ).select(sparkDF1['*'],sparkDF2['q'])


finalDF.orderBy('a').show()

+---+---+---+----+
|  a|  b|  c|   q|
+---+---+---+----+
|  1|  3|  p| Yes|
|  2|  4|  q|  No|
|  3|  4|  r| Yes|
|  4|  7|  s|null|
+---+---+---+----+
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文