将PySpark DataFrame中字符串类型的列表列转为数组类型
解决PySpark中带空格元素的字符串数组转ArrayType问题
你的问题出在正则表达式的选择上:\w+仅匹配字母、数字和下划线,不包含空格,所以会把"clark kent"这类带空格的元素拆成两个独立元素。下面是两种可行的解决方案:
方法1:字符串替换+分割(更直观)
先移除字符串首尾的[],再按, (逗号加空格)分割成数组:
from pyspark.sql.functions import expr df_out = df.withColumn( "column2", expr("split(regexp_replace(column2, '^\\[|\\]$', ''), ', ')") )
regexp_replace(column2, '^\\[|\\]$', ''):去掉字符串开头的[和结尾的]split(..., ', '):用,作为分隔符拆分处理后的字符串,完整保留带空格的元素
方法2:使用正确的正则表达式提取
如果想用regexp_extract_all,需要匹配逗号分隔、包含空格的完整元素,正则规则如下:
from pyspark.sql.functions import expr df_out = df.withColumn( "column2", expr(r"regexp_extract_all(column2, '(?<=\\[|, )[^,]+?(?=, |\\])', 0)") )
(?<=\\[|, ):正向断言,匹配[或者,之后的起始位置[^,]+?:非贪婪匹配任意非逗号的字符(包含空格)(?=, |\\]):正向断言,匹配,或者]之前的结束位置
执行任意一种方法后,得到的结果都会符合你的预期:
| column1 | column2 |
|---|---|
| 1111 | ["clark kent", "john", "silvie"] |
| 2222 | ["bob", "charles", "seth rog"] |
| 3333 | ["jane", "luke max", "adam"] |
内容的提问来源于stack exchange,提问作者Lucas Mengual
相关产品推荐
相关产品推荐

