如何在 PySpark 中仅将数据集的第一个字母大写?(简单大写/句子大小写)

Ano*_*ous 1 python field dataset capitalize pyspark

我需要清理几个字段:物种/描述通常是简单的大写,其中第一个字母大写。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())
Run Code Online (Sandbox Code Playgroud)

有没有办法轻松地利用这些字段?

需要明确的是,我正在尝试将字段中的数据大写。这是一个例子:

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

预期:“这是一个描述。”

wwn*_*nde 11

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


Adi*_*ibP 5

您可以使用解决方法,将第一个字母和其余字母分开,使第一个字母大写,其余字母小写,然后将它们连接回来

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

或者如果你想坚持使用Python,你可以使用UDF.capitalize()

from pyspark.sql.types import StringType

udf_capitalize  = F.udf(lambda x: str(x).capitalize(), StringType())

df = df.withColumn('title_capitalize', udf_capitalize('title'))
Run Code Online (Sandbox Code Playgroud)