我有一个大型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
过滤器推入,还是存在错误?
谢谢!
答案 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中的以下讨论。