You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyspark如何不使用UDF移除数组中的纯字母元素

PySpark数组元素过滤内置函数实现方案

PySpark 2.4及以上版本支持高阶数组函数,无需自定义UDF即可实现需求,核心用到filter数组过滤函数 + rlike正则匹配函数。

实现逻辑

我们需要过滤掉数组中仅由字母组成的元素,匹配该规则的正则表达式为^[A-Za-z]+$,取反后保留不符合该规则的元素即可。

代码示例

1. 构造测试数据

from pyspark.sql import SparkSession
from pyspark.sql.functions import filter, col

# 初始化SparkSession
spark = SparkSession.builder.appName("array_filter_demo").getOrCreate()

# 构造测试用例
test_data = [
    (1, ["abc", "123", "ab12"]),
    (2, ["test", "a1b2", "456", "xyz"])
]
df = spark.createDataFrame(test_data, schema=["id", "arr_col"])

2. 核心过滤逻辑

result_df = df.withColumn(
    "processed_arr",
    # 遍历数组每个元素,过滤掉仅由字母组成的元素
    filter(col("arr_col"), lambda x: ~x.rlike("^[A-Za-z]+$"))
)

# 打印结果
result_df.show(truncate=False)

输出结果

+---+-----------------------+--------------+
|id |arr_col                |processed_arr |
+---+-----------------------+--------------+
|1  |[abc, 123, ab12]       |[123, ab12]   |
|2  |[test, a1b2, 456, xyz] |[a1b2, 456]   |
+---+-----------------------+--------------+

补充说明

  • 如果需要匹配Unicode字母(比如含重音的小语种字母),可将正则替换为^\\p{L}+$
  • 若Spark版本低于2.4,可使用expr调用SQL层的filter函数实现,写法如下:
from pyspark.sql.functions import expr

result_df = df.withColumn(
    "processed_arr",
    expr("filter(arr_col, x -> x not rlike '^[A-Za-z]+$')")
)

内置函数直接在Spark引擎层执行,相比自定义UDF避免了JVM和Python进程之间的序列化开销,性能优势明显。


内容的提问来源于stack exchange,提问作者Mavis Dracula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 05:06:05