我需要清理几个字段:物种/描述通常是一个简单的大写字母,其中第一个字母是大写的。PySpark只有upper、lower和initcap(每个单词都大写(,这不是我想要的。https://spark.apache.org/docs/2.0.1/api/python/_modules/pyspark/sql/functions.html
Python有一个原生的capitalize((函数,我一直在尝试使用它,但对列的调用不正确。
fields_to_cap = ['species', 'description']
for col_name in fields_to_cap:
df = df.withColumn(col_name, df[col_name].captilize())
有没有一种方法可以轻松地将这些字段大写?
需要明确的是,我正试图将字段中的数据大写。这里有一个例子:
电流:"这是一个描述">
预期:"这是一个描述">
使用initcap
data = [
(1001, 'jana', 'yes'),
(1001, 'Jleo', 'no')
]
df = spark.createDataFrame(data, ['SID','species', 'description']).show()
+----+-------+-----------+
| SID|species|description|
+----+-------+-----------+
|1001| jana| yes|
|1001| Jleo| no|
+----+-------+-----------+
from pyspark.sql.functions import *
df.withColumn("species", initcap(col('species'))).withColumn("description", initcap(col('description'))).show()
+----+-------+-----------+
| SID|species|description|
+----+-------+-----------+
|1001| Jana| Yes|
|1001| Jleo| No|
+----+-------+-----------+
您可以使用一种变通方法,将第一个字母和其余字母分开,使第一个字母大写和小写成为其余字母,然后将它们连接回
import pyspark.sql.functions as F
df = spark.createDataFrame([[1, 'rush HouR'],
[2, 'kung-Fu Panda'],
[3, 'titaniC'],
[4, 'the Sixth sense']], schema="id int, title string")
df = df.withColumn('title_capitalize', F.concat(F.upper(F.expr("substring(title, 1, 1)")),
F.lower(F.expr("substring(title, 2)"))))
df.show()
+---+---------------+----------------+
| id| title|title_capitalize|
+---+---------------+----------------+
| 1| rush HouR| Rush hour|
| 2| kung-Fu Panda| Kung-fu panda|
| 3| titaniC| Titanic|
| 4|the Sixth sense| The sixth sense|
+---+---------------+----------------+
或者,如果你想坚持使用Python的.capitalize()
,你可以使用UDF
from pyspark.sql.types import StringType
udf_capitalize = F.udf(lambda x: str(x).capitalize(), StringType())
df = df.withColumn('title_capitalize', udf_capitalize('title'))