使用数据框在 pyspark 中进行列比较

columns comparison in pyspark using dataframes

我有一个数据框 DF1,它包含三列 city1、city2、distance。我想通过删除相同的行之一从 DF1 创建一个新的数据框 DF2

我正在尝试检查城市之间的距离。由于城市(A 和 B)或(B 和 A)将具有相同的距离。我需要删除其中一个

city1  city2  dist
A      B      100
A      C      200
B      A      100
C      B      200

所以在这里,需要删除第 1 行或第 3 行,因为它们被认为是相同的

预期输出

city1   city2  dist
A       B      100
A      C      200
C      B      200

通过创建 array combined all columns 进行排序,然后使用 row_number 函数从 window.

Example:

df.show()
#using some sample records from post
#+-----+-----+----+
#|city1|city2|dist|
#+-----+-----+----+
#|    A|    B| 100|
#|    A|    C| 200|
#|    B|    A| 100|
#+-----+-----+----+

df1=df.withColumn("new_cnct",array_join(array_sort(array(col("city1"),col("city2"),col("dist"))),'')).\
withColumn("s_id",spark_partition_id())

from pyspark.sql import *
from pyspark.sql.window import *

w=Window.partitionBy("new_cnct").orderBy("s_id")

df1.withColumn("rn",row_number().over(w)).\
filter(col("rn") ==1).\
drop("rn","s_id","new_cnct").\
show(10,False)
#+-----+-----+----+
#|city1|city2|dist|
#+-----+-----+----+
#|A    |B    |100 |
#|A    |C    |200 |
#+-----+-----+----+