首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星星之火:使用Stratio和RDD查询Mongodb

星星之火:使用Stratio和RDD查询Mongodb
EN

Stack Overflow用户
提问于 2016-02-19 13:47:40
回答 1查看 255关注 0票数 1

我正在使用Stratio查询MongoDB (0.11)。我有兴趣使用RDDs (没有DataFrame)。

我现在要做的是:

代码语言:javascript
复制
val mongoRDD = new MongodbRDD(sqlContext, readConfig, new MongodbPartitioner(readConfig))
mongoRDD.foreach(println)

并以正确的方式显示集合内容。

是否有一种方法将查询(作为String或通过QueryBuilder构建)与Stratio (在我的示例中是$near类型)一起应用于MongodbRDD

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-19 17:30:39

正如@zero323 323所暗示的,这样做的方法是使用filters参数。这些过滤器由库检查,并与MongoDB QueryBuilder可用过滤器相匹配。

来自Spark 源代码

代码语言:javascript
复制
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用作:

代码语言:javascript
复制
val mongoRDD = new MongodbRDD(
    sqlContext,
    readConfig,
    new MongodbPartitioner(readConfig),
    filters = FilterSection(Array(Near("x", 3.0, 4.0))))
)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35506885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档