您如何将 PySpark 中的第一个字母大写用于数据集? (简单capitalization/sentence案例)

How do you capitalize just the first letter in PySpark for a dataset? (Simple capitalization/sentence case)

我需要清理几个字段:species/description通常是首字母大写的简单大写。 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())

有没有办法轻松地将这些字段大写?

明确地说,我试图将字段中的数据大写。这是一个例子:

当前: “这是一个描述。”

预计: “这是描述。”

您可以通过拆分首字母和其余字母来使用变通方法,将首字母设为大写,将其余字母设为小写,然后将它们连接回去

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'))

使用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|
+----+-------+-----------+