我有一个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|
+--------------+
我想创建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
列?
答案 0 :(得分:5)
您可以使用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|
+--------------+----+---------+
答案 1 :(得分:3)
您可以使用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|
+--------------+----+---------+
答案 2 :(得分:2)
在这种情况下,由于我们要提取字母字符,因此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|
+--------------+----+---------+
答案 3 :(得分:0)
稍加调整即可避免硬编码,并使用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()