数据帧的自然连接

问题描述 投票:0回答:1

SQL 有一个自然的连接操作,但对于数据帧来说似乎没有等效的操作。在 PySpark 中实现自然连接功能的最简单方法是什么?

https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-join.html

鉴于:

x = spark.createDataFrame([(1,'a'),(2,'b'),(3,'c')], ['c1','c2'])
z = spark.createDataFrame([(1,'aaaaa'),(2,'bbbbb')], ['c1','c3'])

时间:

naturalJoin(x,z) # ???

预期结果:

+---+---+-----+
| c1| c2|   c3|
+---+---+-----+
|  1|  a|aaaaa|
|  2|  b|bbbbb|
+---+---+-----+
dataframe apache-spark pyspark apache-spark-sql
1个回答
0
投票

您可以使用

df.join
方法在 pyspark 中获得 Dataframe 的自然连接功能:

from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

x = spark.createDataFrame([(1, "a"), (2, "b"), (3, "c")], ["c1", "c2"])
z = spark.createDataFrame([(1, "aaaaa"), (2, "bbbbb")], ["c1", "c3"])

如果

df.join
的第二个参数是连接表达式,则您无法获得所需的功能:

>>> x.join(z, x.c1 == z.c1).show()
+---+---+---+-----+
| c1| c2| c1|   c3|
+---+---+---+-----+
|  1|  a|  1|aaaaa|
|  2|  b|  2|bbbbb|
+---+---+---+-----+

但是由于您正在尝试执行自然连接,因此您有 2 列具有相同的名称。在这种情况下,

join
的第二个参数可以只是列名而不是连接表达式:

>>> x.join(z, "c1").show()
+---+---+-----+                                                                 
| c1| c2|   c3|
+---+---+-----+
|  1|  a|aaaaa|
|  2|  b|bbbbb|
+---+---+-----+
© www.soinside.com 2019 - 2024. All rights reserved.