Как отсортировать идентификаторы типа А1, А2, А10 в pyspark? - PullRequest
0 голосов
/ 27 января 2019

Как мне отсортировать идентификаторы как A1, A2, A10, B1 и т. Д. В pyspark?

Я хотел бы иметь возможность отсортировать следующий код (фактический список длиннее с другими буквами и т. Д.) AZ.Если я добавлю, скажем, A13 - новый код, а затем AZ, я получу A1,A10,A11 и т. Д.

Когда я пытаюсь сортировать с orderBy, я получаю данные вроде:

A1
A10
A11
A2
A21
etc..

1 Ответ

0 голосов
/ 27 января 2019

Вам придется временно разделить столбец, чтобы достичь желаемого.Следующий код:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...