PySpark使用split按点分割字符串并拆分为多列的问题
问题根因
你的分割代码失效是两个参数传错导致的:
split函数的分隔符参数遵循正则匹配规则,.是正则中的特殊元字符,代表匹配任意单个字符,直接传入无法匹配实际的点号,需要转义为\\.才能匹配点号本身- 你传入的第三个参数
limit值为1,该参数控制分割后返回的数组最大长度,设为1时只会返回包含完整原字符串的单元素数组,要全部分割可以不传该参数(默认值-1为全分割),如果固定要分3段可以传3。
正确实现代码
先导入pyspark函数模块,通过split分割后按数组索引提取对应列即可:
from pyspark.sql import functions as F # 写法1:可读性更高的分步写法 df_with_split = df.withColumn("split_arr", F.split(F.col("col2"), "\\.")) result = df_with_split.select( "col1", F.col("split_arr")[0].alias("col2"), F.col("split_arr")[1].alias("col3"), F.col("split_arr")[2].alias("col4") ) # 写法2:省略中间列的简洁写法 result = df.select( "col1", F.split(F.col("col2"), "\\.")[0].alias("col2"), F.split(F.col("col2"), "\\.")[1].alias("col3"), F.split(F.col("col2"), "\\.")[2].alias("col4") )
执行result.show()即可得到你预期的输出:
+----+----+------------+----+ |col1|col2| col3|col4| +----+----+------------+----+ | 1| SN4|F01C04-AM428|1_31| +----+----+------------+----+
注意:如果数据中存在col2包含点号数量不足2个的行,对应索引位置提取的值会为null,这类场景需要提前做数据校验或填充默认值。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

