如何连接Pyspark中的两列,但影响单个行的连接顺序?

如何连接Pyspark中的两列,但影响单个行的连接顺序?,pyspark,concatenation,Pyspark,Concatenation,我有一个pyspark数据框,它看起来像下面的示例,忽略名为name的列,这是我需要在第1列和第2列中创建的。问题在于,无论第1面包含A面和第2面B还是第1面包含B面和第2面A,名称都必须相同;最终的结果需要是A/B,因此简单地将两个列合并是不可行的,因为名称看起来会不同A/B-B/A。我需要使用名称列进一步进行分组,这就是为什么我需要正确反映名称的原因。有人能告诉我一种方法吗 df = pd.DataFrame({"column1":['Value1','Value2','

我有一个pyspark数据框,它看起来像下面的示例,忽略名为name的列,这是我需要在第1列和第2列中创建的。问题在于,无论第1面包含A面和第2面B还是第1面包含B面和第2面A,名称都必须相同;最终的结果需要是A/B,因此简单地将两个列合并是不可行的,因为名称看起来会不同A/B-B/A。我需要使用名称列进一步进行分组,这就是为什么我需要正确反映名称的原因。有人能告诉我一种方法吗

df = pd.DataFrame({"column1":['Value1','Value2','Value3','Value4','Value5','Value6','Value7','Value8','Value9','Value10','Value11','Value12','Value13','Value14','Value 15','Value16'],\
"column2":['Value1','Value2','Value3','Value4','Value5','Value6','Value7','Value8','Value9','Value10','Value11','Value12','Value13','Value14','Value 15','Value16'],\
"column3":['Value1','Value2','Value3','Value4','Value5','Value6','Value7','Value8','Value9','Value10','Value11','Value12','Value13','Value14','Value 15','Value16'],\
"column4":['Value1','Value2','Value3','Value4','Value5','Value6','Value7','Value8','Value9','Value10','Value11','Value12','Value13','Value14','Value 15','Value16'],\
"side1":['A','B','A','K','C','G','F','F','M','N','S','K','K','N','RE','RA'],\
"side2":['B','A','B','M','H','H','Y','Y','N','M','F','N','N','K','RA','RE']})

您可以使用
排序数组
按字母顺序排列
第1面
第2面
的组合,然后将它们连接起来

from pyspark.sql.functions import *
df.withColumn("name", concat_ws("/", sort_array(array("side 1", "side 2")))).show()

+--------+--------+--------+--------+------+------+-----+                       
|column 1|column 2|column 3|column 4|side 1|side 2| name|
+--------+--------+--------+--------+------+------+-----+
| Value 1| Value 1| Value 1| Value 1|     A|     B|  A/B|
| Value 2| Value 2| Value 2| Value 2|     B|     A|  A/B|
| Value 3| Value 3| Value 3| Value 3|     A|     B|  A/B|
| Value 4| Value 4| Value 4| Value 4|     K|     M|  K/M|
| Value 5| Value 5| Value 5| Value 5|     C|     H|  C/H|
| Value 6| Value 6| Value 6| Value 6|     G|     H|  G/H|
| Value 7| Value 7| Value 7| Value 7|     F|     Y|  F/Y|
| Value 8| Value 8| Value 8| Value 8|     F|     Y|  F/Y|
| Value 9| Value 9| Value 9| Value 9|     M|     N|  M/N|
|Value 10|Value 10|Value 10|Value 10|     N|     M|  M/N|
|Value 11|Value 11|Value 11|Value 11|     S|     F|  F/S|
|Value 12|Value 12|Value 12|Value 12|     K|     N|  K/N|
|Value 13|Value 13|Value 13|Value 13|     K|     N|  K/N|
|Value 14|Value 14|Value 14|Value 14|     N|     K|  K/N|
|Value 15|Value 15|Value 15|Value 15|    RE|    RA|RA/RE|
|Value 16|Value 16|Value 16|Value 16|    RA|    RE|RA/RE|
+--------+--------+--------+--------+------+------+-----+
输出:

df.show()
+--------+--------+--------+------+------+-----+
|column 1|column 2|column 4|side 1|side 2| name|
+--------+--------+--------+------+------+-----+
| Value 1| Value 1| Value 1|     A|     B|  A/B|
| Value 2| Value 2| Value 2|     B|     A|  A/B|
| Value 3| Value 3| Value 3|     A|     B|  A/B|
| Value 4| Value 4| Value 4|     K|     M|  K/M|
| Value 5| Value 5| Value 5|     C|     H|  C/H|
| Value 6| Value 6| Value 6|     G|     H|  G/H|
| Value 7| Value 7| Value 7|     F|     Y|  F/Y|
| Value 8| Value 8| Value 8|     F|     Y|  F/Y|
| Value 9| Value 9| Value 9|     M|     N|  M/N|
|Value 10|Value 10|Value 10|     N|     M|  M/N|
|Value 11|Value 11|Value 11|     S|     F|  F/S|
|Value 12|Value 12|Value 12|     K|     N|  K/N|
|Value 13|Value 13|Value 13|     K|     N|  K/N|
|Value 14|Value 14|Value 14|     N|     K|  K/N|
|Value 15|Value 15|Value 15|    RE|    RA|RA/RE|
|Value 16|Value 16|Value 16|    RA|    RE|RA/RE|
+--------+--------+--------+------+------+-----+
当你说“最终结果必须是A/B”时,你的意思是连接应该基于字母顺序吗?如果是,比较两个字符串,并在
concat
之前相应反转。
df = df.withColumn('name', F.array_join(F.array_sort(F.array('side 1', 'side 2')), '/'))
df.show()
+--------+--------+--------+------+------+-----+
|column 1|column 2|column 4|side 1|side 2| name|
+--------+--------+--------+------+------+-----+
| Value 1| Value 1| Value 1|     A|     B|  A/B|
| Value 2| Value 2| Value 2|     B|     A|  A/B|
| Value 3| Value 3| Value 3|     A|     B|  A/B|
| Value 4| Value 4| Value 4|     K|     M|  K/M|
| Value 5| Value 5| Value 5|     C|     H|  C/H|
| Value 6| Value 6| Value 6|     G|     H|  G/H|
| Value 7| Value 7| Value 7|     F|     Y|  F/Y|
| Value 8| Value 8| Value 8|     F|     Y|  F/Y|
| Value 9| Value 9| Value 9|     M|     N|  M/N|
|Value 10|Value 10|Value 10|     N|     M|  M/N|
|Value 11|Value 11|Value 11|     S|     F|  F/S|
|Value 12|Value 12|Value 12|     K|     N|  K/N|
|Value 13|Value 13|Value 13|     K|     N|  K/N|
|Value 14|Value 14|Value 14|     N|     K|  K/N|
|Value 15|Value 15|Value 15|    RE|    RA|RA/RE|
|Value 16|Value 16|Value 16|    RA|    RE|RA/RE|
+--------+--------+--------+------+------+-----+