如何在PySpark DataFrame中从含斜杠字符串提取目标值?
PySpark 处理斜杠分隔字符串列的解决方案
直接上代码和逻辑,按你的需求实现:
步骤1:准备测试数据
先创建和你示例匹配的DataFrame:
from pyspark.sql import SparkSession from pyspark.sql.functions import split, array_filter, array_min, when, col, cast, size spark = SparkSession.builder.appName("StringSplitProcess").getOrCreate() data = [ ("111/112",), ("113/PAG",), ("801/802/803/804",), ("801/62S",) ] df = spark.createDataFrame(data, ["input_col"]) df.show()
步骤2:实现处理逻辑
核心思路是先拆分字符串为数组,再按规则分支处理:
- 先过滤出数组里非纯数字的元素(匹配包含非数字字符的项)
- 如果存在非纯数字项,直接取该项(假设每组最多一个,若有多个可根据需求调整取第一个或全部)
- 如果全是数字,转成整数数组后取最小值
代码实现:
processed_df = df.withColumn("split_col", split(col("input_col"), "/")) \ .withColumn("alphanumeric_items", array_filter(col("split_col"), lambda x: x.rlike("[^0-9]"))) \ .withColumn("result", when(col("alphanumeric_items").isNotNull() & (size(col("alphanumeric_items")) > 0), col("alphanumeric_items")[0]) \ .otherwise(array_min(col("split_col").cast("array<int>")))) \ .select("input_col", "result") processed_df.show(truncate=False)
结果说明
运行后输出和你的期望完全一致:
+----------------+------+ |input_col |result| +----------------+------+ |111/112 |111 | |113/PAG |PAG | |801/802/803/804 |801 | |801/62S |62S | +----------------+------+
关键函数解释
split(col("input_col"), "/"):把斜杠分隔的字符串拆成数组array_filter(..., lambda x: x.rlike("[^0-9]")):过滤出包含非数字字符的项(即字母数字混合项)when(..., ...).otherwise(...):分支判断,优先取字母数字项,否则取数字最小值array_min(col("split_col").cast("array<int>")):把字符串数组转成整数数组后取最小值
内容的提问来源于stack exchange,提问作者user1702932
相关产品推荐
相关产品推荐

