如何在pyspark中对A1,A2,A10,B1等的ID进行排序?
我希望能够对以下代码进行排序(实际列表与其他字母等相比较长)A-Z.如果我添加A13 – 新代码然后添加A-Z,我会得到A1,A11等
当我尝试使用orderBy进行排序时,我得到的数据如下:
A1
A10
A11
A2
A21
etc..
最佳答案
您必须暂时拆分列以达到您想要的效果.以下代码:
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’)…
+------+------+-----+
|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()