【问题标题】:How to match null using Spark connector for MongoDB?如何使用 MongoDB 的 Spark 连接器匹配 null?
【发布时间】:2017-08-01 15:33:58
【问题描述】:

我正在尝试使用带有 pyspark mongodb 连接器的聚合函数查询 MongoDB 集合,但我无法执行与 null 的匹配。

我已经在管道中尝试过这个:

{'$match' : {'deleted_at': null}}
{'$match' : {'deleted_at': 'null'}}
{'$match' : {'deleted_at': None}}
{'$match' : {'deleted_at': False}}
{'$match' : {'deleted_at': 0}}

但似乎没有任何效果。有什么想法吗?

【问题讨论】:

  • 你用 Spark SQL 尝试过df.filter($"deleted_at" === null) 吗?

标签: mongodb apache-spark pyspark aggregation-framework


【解决方案1】:

您可以在 Spark 中利用过滤器下推(默认)

在将 filters 与 DataFrames 或 Python API 一起使用时,底层 Mongo 连接器代码会构造一个聚合管道在将 MongoDB 中的数据发送到 Spark 之前对其进行过滤

Spark-Mongo connector doc

Python 代码

from pyspark.sql import SparkSession

my_spark = SparkSession \
    .builder \
    .appName("myApp") \
    .config("spark.mongodb.input.uri", "mongodb://127.0.0.1/test.coll") \
    .getOrCreate()

df = spark.read.format("com.mongodb.spark.sql.DefaultSource").load()

filtrDf = df.filter(df['deleted_at'] == 'null')

filtrDf.explain() // check for physical plan of this output 

【讨论】:

  • 也许您可以在 mongo db 中尝试使用 query profiling tools。这样您就可以确认 Spark 正在使用过滤器构建 mongo db 聚合管道。
【解决方案2】:

我找到了一种可能的解决方案,可以让我避免更改所有查询。解决办法是像这样匹配类型:

{'$match' : 'deleted_at': { '$type': 10 }}

因为10对应类型为null

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多