首页 > 解决方案 > 如何将 Pyspark 中由某些字符分隔的每个单词大写?

问题描述

我目前正在使用 Pyspark,我面临一个看似简单的问题。

我想将每个单词的第一个字母大写,即使单词由以下列表中的字符分隔:

delimiter_list = [' ', '(', '+', '/', '-']

实际上,initcap仅适用于由空白类型分隔的单词。

有没有有效的解决方案?以下是一些输入输出示例:

输入 输出
巴登巴登 巴登-巴登
马克兰施塔特/勃兰登堡-基希默瑟 马克兰施塔特/勃兰登堡-基希默瑟
奥斯特罗马佐维茨基/比亚韦斯托克 奥斯特罗·马佐维茨基/比亚韦斯托克

标签: pythonapache-sparkpysparkapache-spark-sqlcapitalize

解决方案


由于分隔符不同,您可以先添加一个通用分隔符,例如#在列表中的每个字符之后delimiter_list使用regexp_replace

regexp_replace(words, '(\\s|\\(|\\+|-|\\/)(.)', '$1#$2')

现在,您可以通过使用函数将每个元素大写来拆分#和转换结果数组。最后,使用函数transform连接数组元素以获取原始字符串:array_join

from pyspark.sql import functions as F

df1 = df.withColumn(
    "words_capitalized",
    F.expr(r"""
        array_join(
            transform(
                split(regexp_replace(words, '(\\s|\\(|\\+|-|\\/)(.)', '$1#$2'), '#'),
                x -> initcap(x)
            ),
            ""
        )
    """)
)

df1.show(truncate=False)

#+-----------------------------------+-----------------------------------+
#|words                              |words_capitalized                  |
#+-----------------------------------+-----------------------------------+
#|baden-baden                        |Baden-Baden                        |
#|markranstadt/brandenburg-kirchmöser|Markranstadt/Brandenburg-Kirchmöser|
#|ostrow mazowiecki/bialystok        |Ostrow Mazowiecki/Bialystok        |
#+-----------------------------------+-----------------------------------+

推荐阅读