正如@ zero323已经暗示,这样做的方法是使用filters
参数。这些过滤器由库进行检查,并与MongoDB QueryBuilder可用过滤器进行匹配。
从火花MongoDB的source code:
sFilters.foreach {
case EqualTo(attribute, value) =>
queryBuilder.put(attribute).is(checkObjectID(attribute, value))
case GreaterThan(attribute, value) =>
queryBuilder.put(attribute).greaterThan(checkObjectID(attribute, value))
case GreaterThanOrEqual(attribute, value) =>
queryBuilder.put(attribute).greaterThanEquals(checkObjectID(attribute, value))
case In(attribute, values) =>
queryBuilder.put(attribute).in(values.map(value => checkObjectID(attribute, value)))
case LessThan(attribute, value) =>
queryBuilder.put(attribute).lessThan(checkObjectID(attribute, value))
case LessThanOrEqual(attribute, value) =>
queryBuilder.put(attribute).lessThanEquals(checkObjectID(attribute, value))
case IsNull(attribute) =>
queryBuilder.put(attribute).is(null)
case IsNotNull(attribute) =>
queryBuilder.put(attribute).notEquals(null)
case And(leftFilter, rightFilter) if !parentFilterIsNot =>
queryBuilder.and(filtersToDBObject(Array(leftFilter)), filtersToDBObject(Array(rightFilter)))
case Or(leftFilter, rightFilter) if !parentFilterIsNot =>
queryBuilder.or(filtersToDBObject(Array(leftFilter)), filtersToDBObject(Array(rightFilter)))
case StringStartsWith(attribute, value) if !parentFilterIsNot =>
queryBuilder.put(attribute).regex(Pattern.compile("^" + value + ".*$"))
case StringEndsWith(attribute, value) if !parentFilterIsNot =>
queryBuilder.put(attribute).regex(Pattern.compile("^.*" + value + "$"))
case StringContains(attribute, value) if !parentFilterIsNot =>
queryBuilder.put(attribute).regex(Pattern.compile(".*" + value + ".*"))
case Not(filter) =>
filtersToDBObject(Array(filter), true)
}
正如你所看到的,near
不被应用,但它似乎是它可以自QueryBuilder
offers methods to use that MongoDB function很容易地添加到连接器的功能。
您可以尝试修改连接器。不过,我会尽力实施它,并在接下来的日子里做一个PR。
编辑:
一个PR has been opened包括描述$near
所以你可以使用MongodbRdd
作为源过滤器类型:
val mongoRDD = new MongodbRDD(
sqlContext,
readConfig,
new MongodbPartitioner(readConfig),
filters = FilterSection(Array(Near("x", 3.0, 4.0))))
)
乍看之下它看起来并不像它。它将SQL谓词向下推,但它不能用于'$ near'。 – zero323
你仍然可以尝试直接使用它:https://github.com/Stratio/Spark-MongoDB/blob/231e1fcb961868963bf7efcae04778d5a9c11f78/spark-mongodb/src/main/scala/com/stratio/datasource/mongodb/rdd/MongodbRDD。 scala#L37 – zero323
是的,我在看“过滤器”,但唯一可以工作的是用“EqualTo”构建所有查询。有点奇怪。 – Randomize