如何在pyspark中对诸如A1,A2,A10之类的ID进行排序?

时间:2019-01-27 11:37:40

标签: python pyspark

如何在pyspark中对A1, A2, A10, B1等ID进行排序?

我希望能够对以下代码进行排序(实际列表较长,带有其他字母等)。如果我添加A13-新代码,然后添加A-Z,则得到A1,A10,A11,依此类推

当我尝试使用orderBy进行排序时,我得到的数据如下:

A1
A10
A11
A2
A21
etc..

1 个答案:

答案 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()