удалить последние несколько символов в столбце данных PySpark - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть PySpark DataFrame. Как я могу отрубить / удалить последние 5 символов из столбца name ниже -

from pyspark.sql.functions import substring, length
valuesCol = [('rose_2012',),('jasmine_2013',),('lily_2014',),('daffodil_2017',),('sunflower_2016',)]
df = sqlContext.createDataFrame(valuesCol,['name'])
df.show()

+--------------+
|          name|
+--------------+
|     rose_2012|
|  jasmine_2013|
|     lily_2014|
| daffodil_2017|
|sunflower_2016|
+--------------+

Я хочу создать 2 столбца, столбец flower и year.

Ожидаемый результат:

+--------------+----+---------+
|          name|year|   flower|
+--------------+----+---------+
|     rose_2012|2012|     rose|
|  jasmine_2013|2013|  jasmine|
|     lily_2014|2014|     lily|
| daffodil_2017|2017| daffodil|
|sunflower_2016|2016|subflower|
+--------------+----+---------+

year столбец, который я создал -

df = df.withColumn("year", substring(col("name"),-4,4))
df.show()
+--------------+----+
|          name|year|
+--------------+----+
|     rose_2012|2012|
|  jasmine_2013|2013|
|     lily_2014|2014|
| daffodil_2017|2017|
|sunflower_2016|2016|
+--------------+----+

Я не знаю, как нарезать последние 5 символов, чтобы у меня было только название цветов. Я пробовал что-то подобное, вызывая length, но это не работает.

df = df.withColumn("flower",substring(col("name"),0,length(col("name"))-5))

Как создать столбец flower только с названиями цветов?

Ответы [ 4 ]

0 голосов
/ 26 марта 2019

Добавление небольшого количества настроек для избежания жесткого кодирования и динамического определения длины столбца через местоположение подчеркивания ('_') с помощью функции instr.

df = spark.createDataFrame([('rose_2012',),('jasmine_2013',),('lily_2014',),('daffodil_2017',),('sunflower_2016',)],['name'])


df.withColumn("flower",expr("substr(name, 1, (instr(name,'_')-1) )")).\
        withColumn("year",expr("substr(name, (instr(name,'_')+1),length(name))")).show()
0 голосов
/ 05 ноября 2018

Вы можете использовать функцию expr

>>> from pyspark.sql.functions import substring, length, col, expr
>>> df = df.withColumn("flower",expr("substring(name, 1, length(name)-5)"))
>>> df.show()
+--------------+----+---------+
|          name|year|   flower|
+--------------+----+---------+
|     rose_2012|2012|     rose|
|  jasmine_2013|2013|  jasmine|
|     lily_2014|2014|     lily|
| daffodil_2017|2017| daffodil|
|sunflower_2016|2016|sunflower|
+--------------+----+---------+
0 голосов
/ 05 ноября 2018

В этом случае, поскольку мы хотим извлечь алфавитные символы, REGEX также будет работать.

from pyspark.sql.functions import regexp_extract 
df = df.withColumn("flower",regexp_extract(df['name'], '[a-zA-Z]+',0))
df.show()
+--------------+----+---------+
|          name|year|   flower|
+--------------+----+---------+
|     rose_2012|2012|     rose|
|  jasmine_2013|2013|  jasmine|
|     lily_2014|2014|     lily|
| daffodil_2017|2017| daffodil|
|sunflower_2016|2016|sunflower|
+--------------+----+---------+
0 голосов
/ 05 ноября 2018

Вы можете использовать функцию split. этот код делает то, что вы хотите:

import pyspark.sql.functions as f

newDF = df.withColumn("year", f.split(df['name'], '\_')[1]).\
           withColumn("flower", f.split(df['name'], '\_')[0])

newDF.show()

+--------------+----+---------+
|          name|year|   flower|
+--------------+----+---------+
|     rose_2012|2012|     rose|
|  jasmine_2013|2013|  jasmine|
|     lily_2014|2014|     lily|
| daffodil_2017|2017| daffodil|
|sunflower_2016|2016|sunflower|
+--------------+----+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...