Python 在PySpark数据帧中创建记录对
我有一个PySpark数据框,看起来像:Python 在PySpark数据帧中创建记录对,python,pyspark,Python,Pyspark,我有一个PySpark数据框,看起来像: +---+---+---+ | x| y| z| +---+---+---+ | A| 1| 2| | B| 3| 4| | C| 5| 6| | D| 7| 8| +---+---+---+ 我想要一个结果数据帧,它包含两个记录对,每个记录对每个记录,除了它自身存在于上述数据帧中之外。不应该有重复的对。例如,如果出现A-B和B-A,则仅保留A-B 对于上述数据帧,对数应等于lendf*lendf-1/2=6 预期产出:
+---+---+---+
| x| y| z|
+---+---+---+
| A| 1| 2|
| B| 3| 4|
| C| 5| 6|
| D| 7| 8|
+---+---+---+
我想要一个结果数据帧,它包含两个记录对,每个记录对每个记录,除了它自身存在于上述数据帧中之外。不应该有重复的对。例如,如果出现A-B和B-A,则仅保留A-B
对于上述数据帧,对数应等于lendf*lendf-1/2=6
预期产出:
+---+---+---+---+---+---+
|x_1|y_1|z_1|x_2|y_2|z_2|
+---+---+---+---+---+---+
| A| 1| 2| B| 3| 4|
| A| 1| 2| C| 5| 6|
| A| 1| 2| D| 7| 8|
| B| 3| 4| C| 5| 6|
| B| 3| 4| D| 7| 8|
| C| 5| 6| D| 7| 8|
+---+---+---+---+---+---+
在PySpark中如何执行此操作?有没有像自连接或笛卡尔积这样的连接?谢谢
-编辑-
我能够做交叉连接,得到所有16对
temp2 = temp.withColumnRenamed('x', 'x_1').crossJoin(temp.withColumnRenamed('x', 'x_2'))
temp2.orderBy(['x_1', 'x_2'], ascending = [True, True]).show()
输出:
+---+---+---+---+---+---+
|x_1| y| z|x_2| y| z|
+---+---+---+---+---+---+
| A| 1| 2| A| 1| 2|
| A| 1| 2| B| 3| 4|
| A| 1| 2| C| 5| 6|
| A| 1| 2| D| 7| 8|
| B| 3| 4| A| 1| 2|
| B| 3| 4| B| 3| 4|
| B| 3| 4| C| 5| 6|
| B| 3| 4| D| 7| 8|
| C| 5| 6| A| 1| 2|
| C| 5| 6| B| 3| 4|
| C| 5| 6| C| 5| 6|
| C| 5| 6| D| 7| 8|
| D| 7| 8| A| 1| 2|
| D| 7| 8| B| 3| 4|
| D| 7| 8| C| 5| 6|
| D| 7| 8| D| 7| 8|
+---+---+---+---+---+---+
但我不想要多余的和自我配对 此任务需要非等连接,这在性能方面非常糟糕。 我希望你的台词不要太多 从pyspark.sql导入函数为F,窗口为w a=[ A、 1,2,, B、 3,4,, C、 5,6, D、 7,8, ] b=x y z df=spark.createDataFramea,b df_2=df.withColumn 注意, F.row_编号.OVR.orderByx df_final=df_2.aliasdf_l.crossJoindf_2.aliasdf_r df_final.wheredf_l.nb