PySpark 2.2中如何对数组列的每个元素执行子串截取操作
PySpark 2.2 数组列元素子串截取方案
由于PySpark 2.2未提供高版本中的transform高阶函数,直接使用UDF是最直接的实现方式,针对你的需求有两种可选实现:
方案1:固定长度切片(适用于连字符前长度完全固定的场景)
你原有代码结果不符合预期的核心原因是切片长度设置错误,你的示例中连字符前的字符串长度为5,因此需要调整切片范围:
import pyspark.sql.functions as F import pyspark.sql.types as T # 切片为前闭后开规则,取前5位需写0:5,同时增加空值判断避免运行报错 cust_udf = F.udf(lambda arr: [x[0:5] for x in arr] if arr is not None else [], T.ArrayType(T.StringType())) df1 = df1.withColumn('new_column', cust_udf(F.col("col1")))
方案2:按分隔符截取(更鲁棒,不受前置长度变化影响)
如果后续业务中连字符前的长度可能变化,推荐按分隔符-拆分后取第一个元素,逻辑更稳定:
import pyspark.sql.functions as F import pyspark.sql.types as T cust_udf = F.udf(lambda arr: [x.split('-')[0] for x in arr] if arr is not None else [], T.ArrayType(T.StringType())) df1 = df1.withColumn('new_column', cust_udf(F.col("col1")))
两种方案都兼容PySpark 2.2版本,运行后即可得到你示例中的new_column输出效果。
内容的提问来源于stack exchange,提问作者Egodym
相关产品推荐
相关产品推荐

