Как разделить номер писпарка или НЛП - PullRequest
2 голосов
/ 10 октября 2019

Я хочу сделать несколько разбиений в одном столбце моего кадра данных. Пример:

s = "Cras mattis MP the -69661/69662;69663 /IS4567"

Как мне получить:

s = ['Cras', 'mattis', 'MP', 'the', '69661', '69662', '69663', 'IS4567' ]

Спасибо

Ответы [ 2 ]

7 голосов
/ 11 октября 2019

В одну сторону, используя встроенные функции SparkSQL предложения () и flatten () [требуется искра 2.4.0+ для flatten () ]:

from pyspark.sql.functions import expr

df.withColumn('new_s', expr('flatten(sentences(s))')).show(truncate=False)    
#+---------------------------------------------+----------------------------------------------------+
#|s                                            |new_s                                               |
#+---------------------------------------------+----------------------------------------------------+
#|Cras mattis MP the -69661/69662;69663 /IS4567|[Cras, mattis, MP, the, 69661, 69662, 69663, IS4567]|
#+---------------------------------------------+----------------------------------------------------+

что предложений () делает из документации Apache Hive:

Маркирует строку текста на естественном языке на слова и предложения, где каждое предложение разбивается насоответствующая граница предложения и возвращается как массив слов. 'Lang' и 'locale' являются необязательными аргументами. Например, предложения («Привет! Как дела?») Возвращает ((«Привет», «Там»), («Как», «Есть», «Вы»)).

4 голосов
/ 11 октября 2019

Вы можете использовать split функции, которые используют шаблон регулярного выражения для разделения данных.

import pyspark.sql.functions as f

df.withColumn('ns', f.split('s', "[^a-zA-Z0-9']+")).show(10,False)
+---------------------------------------------+----------------------------------------------------+
|s                                            |ns                                                  |
+---------------------------------------------+----------------------------------------------------+
|Cras mattis MP the -69661/69662;69663 /IS4567|[Cras, mattis, MP, the, 69661, 69662, 69663, IS4567]|
+---------------------------------------------+----------------------------------------------------+

Примечание: "[^a-zA-Z0-9']+" позаботится об основных английских символах, ноесли вы хотите включить специальные символы, вы можете использовать \p{L} вместо a-zA-Z как "[^\\p{L}0-9']+"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...