加入两个分区数据框pyspark

Posted

技术标签:

【中文标题】加入两个分区数据框pyspark【英文标题】:join two patrition dataframe pyspark 【发布时间】:2019-09-04 07:24:38 【问题描述】:

我有两个分区级别为 2 的数据帧。数据帧很小,每个大约 100 行。

df1:

col1    columnindex
null        1
null        2
null        3
null        4
100         5
101         6
102         7
103         8
104         9
105         10

df2:

col2    columnindex
100         1
200         2
null        3
null        4
100         5
101         6
null        7
103         8
null        9
105         10

我的最终 df 将是基于 columnindex 的 df1 和 df2 的连接。

col1    col2    columnindex
null    100       1
null    200       2
null    null      3
null    null      4
100     100       5
101     101       6
102     null      7
103     103       8
104     null      9
105     105       10

但是当我按照下面的方式加入两个数据框时,它看起来正在洗牌并给我不正确的结果。有什么办法可以避免洗牌。

df1.join(df2, df1.columnindex == df2.columnindex, 'inner')

【问题讨论】:

感谢您的提问。你能通过复制粘贴提供一些“假”数据吗? 【参考方案1】:

这取决于你所说的洗牌是什么意思。

join1 = spark.createDataFrame([(None, 1), (None, 2), (None, 3), (100, 5), (101, 6), (105, 10)], ['col1', 'columnindex'])
join2 = spark.createDataFrame([(100, 1), (200, 2), (None, 3), (100, 5), (101, 6), (None, 10)], ['col2', 'columnindex'])
joined = join1.join(join2, ['columnindex'], 'inner').select(['columnindex', 'col1', 'col2'])
joined.show()

结果:

+-----------+----+----+
|columnindex|col1|col2|
+-----------+----+----+
|          2|null| 200|
|          5| 100| 100|
|          3|null|null|
|          6| 101| 101|
|          1|null| 100|
|         10| 105|null|
+-----------+----+----+

这是一个正确的结果 - 每个 columnindex 对应于两个数据帧中的正确值,如果您进行任何进一步的计算,这应该不是问题。 但是,如果您希望按 columnindex 对值进行排序,则可以使用 orderBy

joined.orderBy('columnindex').show()
+-----------+----+----+
|columnindex|col1|col2|
+-----------+----+----+
|          1|null| 100|
|          2|null| 200|
|          3|null|null|
|          5| 100| 100|
|          6| 101| 101|
|         10| 105|null|
+-----------+----+----+

关于连接的快速说明 - 如果您使用 df1.columnindex == df2.columnindex,这将导致重复的 columnindex 列,您必须在使用 orderBy 对其进行排序之前解决这个问题,这就是为什么将列名称作为如上所述列出join 的参数。

【讨论】:

嗨,Rajesh,这是我的答案,Vikrant 提供了格式修复?如果您发现答案有用,请点赞并将其标记为已接受 @ Rajesh Meher .. 是的,我刚刚为格式化做出了贡献,您可以作为所有者接受这个答案。谢谢

以上是关于加入两个分区数据框pyspark的主要内容,如果未能解决你的问题,请参考以下文章

Spark如何仅在分区内加入

如何确定 PySpark 数据框分区的“首选位置”?

加入两个熊猫数据框

加入两个数据框pyspark

加入两个数据框和结果数据框在 PySpark 中包含不重复的项目?

加入两个数据框表[重复]