删除PySpark数据框列中的最后几个字符

cph*_*sto 4 python substring pyspark

我有一个PySpark DataFrame。如何从name下面的栏中删除/删除最后5个字符-

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|
+--------------+
Run Code Online (Sandbox Code Playgroud)

我想创建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|
+--------------+----+---------+
Run Code Online (Sandbox Code Playgroud)

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|
+--------------+----+
Run Code Online (Sandbox Code Playgroud)

我不知道怎么砍最后五个字符,所以我只有花的名字。我通过调用尝试了类似的方法length,但这不起作用。

df = df.withColumn("flower",substring(col("name"),0,length(col("name"))-5))
Run Code Online (Sandbox Code Playgroud)

如何创建flower仅包含花名的列?

Ali*_*lli 6

您可以使用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|
+--------------+----+---------+
Run Code Online (Sandbox Code Playgroud)


Ali*_*AzG 5

您可以使用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|
+--------------+----+---------+
Run Code Online (Sandbox Code Playgroud)


cph*_*sto 5

在这种情况下,由于我们要提取字母字符,因此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|
+--------------+----+---------+
Run Code Online (Sandbox Code Playgroud)