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