我正在使用Stratio查询MongoDB (0.11)。我有兴趣使用RDDs (没有DataFrame)。
我现在要做的是:
val mongoRDD = new MongodbRDD(sqlContext, readConfig, new MongodbPartitioner(readConfig))
mongoRDD.foreach(println)并以正确的方式显示集合内容。
是否有一种方法将查询(作为String或通过QueryBuilder构建)与Stratio (在我的示例中是$near类型)一起应用于MongodbRDD
发布于 2016-02-19 17:30:39
正如@zero323 323所暗示的,这样做的方法是使用filters参数。这些过滤器由库检查,并与MongoDB QueryBuilder可用过滤器相匹配。
来自Spark 源代码:
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 提供使用该MongoDB函数的方法。。
您可以尝试修改连接器。然而,我将尝试实现它,并在接下来的几天做一个公关。
编辑:
公共关系已经打开,包括描述$near的源代码筛选器类型,因此您可以将MongodbRdd用作:
val mongoRDD = new MongodbRDD(
sqlContext,
readConfig,
new MongodbPartitioner(readConfig),
filters = FilterSection(Array(Near("x", 3.0, 4.0))))
)https://stackoverflow.com/questions/35506885
复制相似问题