为什么Spark Mongo连接器不向下推过滤器?

时间:2019-04-18 13:56:20

标签: database mongodb apache-spark

我有一个大型Mongo集合,我想使用Spark Mongo连接器在我的Spark应用程序中使用。该集合非常大(> 10 GB),并且具有每日数据,并且在original_item.CreatedDate字段上具有索引。在Mongo中选择几天的查询非常快(不到一秒钟)。但是,当我使用数据帧编写相同的查询时,该过滤器没有下推到Mongo,导致性能极慢,因为Spark显然会获取整个集合并进行过滤。

查询的外观如下:

collection
      .filter("original_item.CreatedDate  > %s" % str(start_date_timestamp_ms)) \
      .filter("original_item.CreatedDate  < %s" % str(end_date_timestamp_ms)) \
      .select(...)

在物理计划中,我看到: PushedFilters: [IsNotNull(original_item)]

当我使用类似的查询对集合的另一个字段进行过滤时,mongo成功地将其按下-PushedFilters: [IsNotNull(original_item), IsNotNull(doc_type), EqualTo(doc_type,case)]

Mongo Spark连接器不支持GreaterThan过滤器推入,还是存在错误?

谢谢!

1 个答案:

答案 0 :(得分:1)

不是引起问题的const data = [8, 5, 2, 33, 5, 45]; data.sort((a, b) => b - a); let lastRank = 0; let lastData; const output = data.map((data, i) => { const objToReturn = { data }; objToReturn.rank = data === lastData ? lastRank : i + 1; lastData = data; lastRank = objToReturn.rank; return objToReturn; }); console.log(output);,而是过滤器位于嵌套字段中的事实。您在GreaterThan上使用的过滤器有效,因为它没有嵌套。这显然是Spark中的Catalyst引擎而不是Mongo连接器的问题。它还会影响Parquet等谓词下推。

有关更多详细信息,请参见Spark Jira中的以下讨论。

Spark 19638

Spark 17636