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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:55:15