如何在pyspark中对A1, A2, A10, B1
等ID进行排序?
我希望能够对以下代码进行排序(实际列表较长,带有其他字母等)。如果我添加A13
-新代码,然后添加A-Z,则得到A1,A10,A11
,依此类推
当我尝试使用orderBy
进行排序时,我得到的数据如下:
A1
A10
A11
A2
A21
etc..
答案 0 :(得分:3)
您将不得不暂时拆分专栏以实现所需的功能。以下代码:
from pyspark.sql import types as T
vals = ['A1','F1' ,'A10','A11','C23','A2','A21']
tempNames = ['letter', 'number']
df = spark.createDataFrame(vals, T.StringType())
df = df.select(F.regexp_extract('value', "(\w)", 1).alias(tempNames[0])
,F.regexp_extract('value', "\w(\d*)", 1).cast('int').alias(tempNames[1])
,df.value).orderBy(tempNames).drop(*tempNames)
df.show()
从您的列中临时创建两列(“字母”和“数字”)...
+------+------+-----+
|letter|number|value|
+------+------+-----+
| A| 1| A1|
| F| 1| F1|
| A| 10| A10|
| A| 11| A11|
| C| 23| C23|
| A| 2| A2|
| A| 21| A21|
+------+------+-----+
...并使用它们对您的列进行排序:
+-----+
|value|
+-----+
| A1|
| A2|
| A10|
| A11|
| A21|
| C23|
| F1|
+-----+
@pault提出的更简短的解决方案:
df.orderBy(F.regexp_extract(F.col("value"), r"[A-Za-z]+", 0), F.regexp_extract(F.col("value"), r"\d+", 0).cast('int')).show()