如何将pyspark中由某些字符分隔的每个单词大写?

wmvff8tz  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(279)

我现在在pyspark工作,我面临一个看似简单的问题。
我想将每个单词的第一个字母大写,即使这些单词由以下列表中的字符分隔:

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

事实上, initcap 仅适用于由空白类型分隔的单词。
有没有一个有效的解决方案?以下是一些输入输出示例:
输入输出Baden badenbaden badenmarkranstadt/brandenburg kirchmösermarkranstadt/勃兰登堡kirchmö塞罗斯特罗·马佐维茨基/比亚利斯托科斯特罗·马佐维茨基/比亚利斯托克

tvokkenx

tvokkenx1#

由于分隔符不同,您可以首先添加一个公共分隔符,例如 # 在列表中的每个字符之后 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        |

# +-----------------------------------+-----------------------------------+
xqkwcwgp

xqkwcwgp2#

我认为可能需要一个自定义项。您可能需要手动管理regex模式,因为需要转义某些特殊字符,例如 ( 以及 + .

import pyspark.sql.functions as F
import re

df.show(truncate=False)
+-----------------------------------+
|words                              |
+-----------------------------------+
|baden-baden                        |
|markranstadt/brandenburg-kirchmöser|
|ostrow mazowiecki/bialystok        |
+-----------------------------------+

words_udf = F.udf(
    lambda w: re.sub(r'(^| |\(|\+|-|/)([a-z])', lambda x: x.group(1) + x.group(2).upper(), w)
)

df.select(words_udf('words').alias('words')).show(truncate=False)
+-----------------------------------+
|words                              |
+-----------------------------------+
|Baden-Baden                        |
|Markranstadt/Brandenburg-Kirchmöser|
|Ostrow Mazowiecki/Bialystok        |
+-----------------------------------+

相关问题