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|
+---+---+-----+
您可以使用
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|
+---+---+-----+