pyspark Regexp_Extract - извлечение нескольких слов из строкового столбца - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь извлечь слова из столбца строк с помощью регулярного выражения pyspark.

Мой фрейм данных ниже:

ID, Code

10, A1005*B1003

12, A1007*D1008*C1004

result=df.withColumn('Code1', regexp_extract(col(Code), '\w+',0))

Выход:

ID, Code,              Code1, 

10, A1005*B1003,       A1005

12, A1007*D1008*C1004, A1007

result=df.withColumn('Code1', regexp_extract(col(Code), '\w+',0))

Выход:

ID, Code,              Code1, 

10, A1005*B1003,       A1005

12, A1007*D1008*C1004, A1007

Я хочу извлечь коды из столбца Код и хочу, чтобы мой DataFrame отображался, как показано ниже.

ID, Code,              Code1,  Code2,  Code3

10, A1005*B1003,       A1005,  B1003,  null

12, A1007*D1008*C1004, A1007,  D1008,  C1004

1 Ответ

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

Предположим, ваш столбец ID уникален для каждой строки;Вот один из способов сделать это с split, explode и затем pivot:

import pyspark.sql.functions as f

(df.select('ID', 'Code', f.posexplode(f.split('Code', '\\*')))
   .withColumn('pos', f.concat(f.lit('code'), f.col('pos')))
   .groupBy('ID', 'Code').pivot('pos').agg(f.first('col'))
   .show())
+---+-----------------+-----+-----+-----+
| ID|             Code|code0|code1|code2|
+---+-----------------+-----+-----+-----+
| 10|      A1005*B1003|A1005|B1003| null|
| 12|A1007*D1008*C1004|A1007|D1008|C1004|
+---+-----------------+-----+-----+-----+

Другой вариант без поворота:

df1 = df.select('ID', 'Code', f.split('Code', '\\*').alias('Codes'))
maxCodes = df1.agg(f.max(f.size('Codes'))).first()[0]      # 3
df1.select(
  'ID', 'Code', 
  *[f.col('Codes').getItem(i).alias(f'Code{i+1}') for i in range(maxCodes)]
).show()
+---+-----------------+-----+-----+-----+
| ID|             Code|Code1|Code2|Code3|
+---+-----------------+-----+-----+-----+
| 10|      A1005*B1003|A1005|B1003| null|
| 12|A1007*D1008*C1004|A1007|D1008|C1004|
+---+-----------------+-----+-----+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...