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
相关产品推荐
相关产品推荐

