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

MongoDB正则查询仅无引号时生效,PySpark带引号传参问题求解

解决PySpark向MongoDB传递正则查询的引号问题

问题根源

核心问题在于:MongoDB中/20220914/是正则表达式对象,而带引号的"/20220914/"是普通字符串。当PySpark传递带引号的字符串时,MongoDB会尝试匹配字段值完全等于该字符串的文档,自然查不到结果。

两种可行解决方案

方案1:PySpark构造MongoDB标准正则查询格式

MongoDB支持通过$regex操作符传递正则模式,不需要依赖原生的/.../语法。在PySpark中直接构造包含$regex的查询条件,就能让MongoDB识别为正则匹配:

from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder \
    .appName("MongoDBRegexQuery") \
    .config("spark.mongodb.input.uri", "mongodb://localhost:27017/your_db.outgoing_counts") \
    .getOrCreate()

# 构造带$regex的查询条件
match_condition = {"CALL_DATE_HOUR": {"$regex": "20220914"}}
# 用pipeline传递查询
df = spark.read.format("mongodb") \
    .option("pipeline", f"[{{'$match': {match_condition}}}]") \
    .load()

# 查看结果
df.show()

如果用DataFrame的filter语法,也可以结合Spark的正则函数实现:

from pyspark.sql.functions import regexp_extract

df = spark.read.format("mongodb").load()
filtered_df = df.filter(regexp_extract("CALL_DATE_HOUR", "20220914", 0) != "")
filtered_df.show()

方案2:MongoDB端适配带引号的正则字符串

如果必须传递带引号的字符串(比如某些场景下无法修改PySpark的传参逻辑),需要先清理掉字符串中多余的/,再用$regex包裹:

# 假设你只能拿到带引号的模式字符串,先处理掉首尾的/
pattern = "/20220914/"
clean_pattern = pattern.strip("/")
match_condition = {"CALL_DATE_HOUR": {"$regex": clean_pattern}}
# 后续同方案1的查询逻辑

这样MongoDB会将clean_pattern识别为正则模式,而非普通字符串进行匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:50:24