通过正则表达式捕获组拆分 Spark 数据帧列中的字符串

2024-01-02

给定下面的数据框,我想将数字列拆分为数组中原始数字的每个元素包含 3 个字符的数组

给定数据框:

+---+------------------+
| id|           numbers|
+---+------------------+
|742|         000000000|
|744|            000000|
|746|003000000000000000|
+---+------------------+

预期数据框:

+---+----------------------------------+
| id|           numbers                |
+---+----------------------------------+
|742| [000, 000, 000]                  |
|744| [000, 000]                       |
|746| [003, 000, 000, 000, 000, 000]   |
+---+----------------------------------+

我在使用时尝试了不同的正则表达式split下面给出的函数与我认为应该在第一次尝试时就可以工作的正则表达式:

import pyspark.sql.functions as f

df = spark.createDataFrame(
    [
        [742, '000000000'], 
        [744, '000000'], 
        [746, '003000000000000000'], 
    ],
    ["id", "numbers"]
)

df = df.withColumn("numbers", f.split("numbers", "[0-9]{3}"))

df.show()

然而结果是

+---+--------------+
| id|       numbers|
+---+--------------+
|742|      [, , , ]|
|744|        [, , ]|
|746|[, , , , , , ]|
+---+--------------+

我想了解我做错了什么。是否有可能设置全局标志来获取所有匹配项,或者我是否完全错过了正则表达式中的某些内容?


下面介绍了如何在不使用udf:

df = df.withColumn(
    "numbers",
    f.split(f.regexp_replace("numbers", "([0-9]{3})(?!$)", r"$1,"), ",")
)

df.show(truncate=False)
#+---+------------------------------+
#|id |numbers                       |
#+---+------------------------------+
#|742|[000, 000, 000]               |
#|744|[000, 000]                    |
#|746|[003, 000, 000, 000, 000, 000]|
#+---+------------------------------+

首次使用pyspark.sql.functions.regexp_replace http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.regexp_replace将 3 位数字的序列替换为后跟逗号的序列。然后用逗号分割结果字符串。

替换模式"$1,"表示第一个捕获组,后跟一个逗号。

在匹配模式中,我们还包括字符串结尾的负前瞻,(?!$), 以避免在字符串末尾添加逗号。

参考:REGEXP_REPLACE 捕获组 https://stackoverflow.com/questions/28592180/regexp-replace-capturing-groups/28594182

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过正则表达式捕获组拆分 Spark 数据帧列中的字符串 的相关文章

随机推荐