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

