如何在PySpark DataFrame中筛选以单个0开头且非纯数字的记录?
PySpark 过滤符合条件的序列号记录
需求回顾
需要从给定的DataFrame中提取满足以下两个条件的记录:
- 以单个0开头(即不能以连续多个0开头)
- 并非纯数字(包含字母或特殊字符)
解决方案
可以通过拆分条件过滤,或使用合并后的正则表达式实现:
方法一:拆分条件过滤
先判断开头是否为单个0,再排除纯数字记录:
from pyspark.sql import SparkSession from pyspark.sql.functions import col # 创建示例DataFrame spark = SparkSession.builder.appName("SerialFilter").getOrCreate() data = [("000001234",), ("000002887",), ("00008765",), ("0745-218",), ("01-7865",), ("040/7868L",), ("0000124",), ("00002364",), ("01231325246",), ("068775H",)] df = spark.createDataFrame(data, ["serial_number"]) # 过滤条件:以0开头但不以00开头,且不是纯数字 filtered_df = df.filter( (col("serial_number").startswith("0") & ~col("serial_number").startswith("00")) & ~col("serial_number").rlike("^\\d+$") ) filtered_df.show()
方法二:使用合并正则表达式
用正则一次性匹配两个条件:
# 正则解释: # ^0:以0开头 # (?!0):负向预查,确保第二个字符不是0(保证单个0开头) # .*[^\\d].*:确保字符串中至少包含一个非数字字符 filtered_df = df.filter(col("serial_number").rlike("^0(?!0).*[^\\d].*$")) filtered_df.show()
结果输出
运行后会得到符合要求的记录:
+-------------+ |serial_number| +-------------+ | 0745-218| | 01-7865| | 040/7868L| | 068775H| +-------------+
为什么之前的正则^0[^0]无效?
^0[^0]仅能保证字符串以0开头且第二个字符不是0,但无法排除后续全为数字的情况(比如01231325246),因此必须加上"非纯数字"的判断条件。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

