给定以下数据框,我想将数字列拆分为数组中原始数字的每个元素 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|[, , , , , , ]|
+---+--------------+
我想了解我做错了什么。是否有可能设置全局标志以获取所有匹配项,或者我是否完全遗漏了正则表达式中的某些内容?
原文由 Shadab Shariff 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下是如何在不使用
udf
的情况下执行此操作:首先使用
pyspark.sql.functions.regexp_replace
将 3 位数字的序列替换为后跟逗号的序列。然后用逗号分割结果字符串。替换模式
"$1,"
表示第一个捕获组,后跟一个逗号。在匹配模式中,我们还包括对字符串结尾的否定前瞻,
(?!$)
,以避免在字符串结尾添加逗号。参考: REGEXP_REPLACE 捕获组