在加入后停止pyspark返回“on”列

qpgpyjmq  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(424)

我在pyspark中有两个Dataframe,希望对它们执行外部连接。我需要能够将它们连接到每个表中不同的列名上,这些列名可能会改变(因此需要是一个变量,而不是硬编码的)。但是,当我此时执行此操作时,pyspark返回一个Dataframe,其中包含两个正在连接的列,其中一些值填充为null。
我目前使用的代码示例如下:

>>> df1 = spark.createDataFrame([[1,'apple'],[2,'orange']], ['id_fruit','fruit'])
>>> df2 = spark.createDataFrame([[2,100],[3,30]], ['fruit_id','numberInStock'])

>>> df1.show()
+--------+------+
|id_fruit| fruit|
+--------+------+
|       1| apple|
|       2|orange|
+--------+------+

>>> df2.show()
+--------+-------------+
|fruit_id|numberInStock|
+--------+-------------+
|       2|          100|
|       3|           30|
+--------+-------------+

>>> left_join_on = 'id_fruit'
>>> right_join_on = 'fruit_id'

>>> df1.join(df2, df1[left_join_on] == df2[right_join_on], how='outer').show()
+--------+------+--------+-------------+
|id_fruit| fruit|fruit_id|numberInStock|
+--------+------+--------+-------------+
|       1| apple|    null|         null|
|    null|  null|       3|           30|
|       2|orange|       2|          100|
+--------+------+--------+-------------+

如上所述,用于连接的两个列都被保留。对于内部联接,这是可以的(例如,我可以删除其中一列),但是对于外部联接,我确实需要同一列中的两个id值(例如,如果我想进行后续联接)。理想情况下,我想要的输出如下所示:

+--------+------+-------------+
|id_fruit| fruit|numberInStock|
+--------+------+-------------+
|       1| apple|         null|
|       3|  null|           30|
|       2|orange|          100|
+--------+------+-------------+

只有一个id列。有人知道我是怎么做到的吗?

kjthegm6

kjthegm61#

你可以 coalesce 两列:

df1.join(df2, df1[left_join_on] == df2[right_join_on], how='outer') \
   .select('*', F.coalesce(F.col(left_join_on), F.col(right_join_on))) \
   .show()

如果你只想保留合并的列,

df1.join(df2, df1[left_join_on] == df2[right_join_on], how='outer') \
   .select('*', F.coalesce(F.col(left_join_on), F.col(right_join_on)).alias('coalesced')) \
   .drop(left_join_on, right_join_on) \
   .show()

相关问题