/ / स्पार्क: स्ट्रैगो और आरडीडी के साथ मोंगोडब की क्वेरी - मोंगोडब, अपाचे-स्पार्क, स्ट्रैटो

स्पार्क: स्ट्रैगो और आरडीडी के साथ मोंगोडब की क्वेरी - मोंगोडब, अपाचे-स्पार्क, स्ट्रैटो

मैं स्ट्रैगो (0.11।) का उपयोग करके स्पार्क के साथ MongoDB क्वेरी कर रहा हूं। मुझे आरडीडी (कोई डेटाफ़्रेम) का उपयोग करने में दिलचस्पी है।

अभी मैं जो कर रहा हूं वह है:

val mongoRDD = new MongodbRDD(sqlContext, readConfig, new MongodbPartitioner(readConfig))
mongoRDD.foreach(println)

और यह संग्रह सामग्री को सही तरीके से प्रदर्शित करता है।

क्या कोई क्वेरी का उपयोग करने का एक तरीका है (जैसा कि String या के माध्यम से बनाया गया है QueryBuilder) लागू करने के लिए स्ट्रैटो (मेरे मामले में क्वेरी $ प्रकार के पास है) के साथ MongodbRDD?

उत्तर:

जवाब के लिए 3 № 1

जैसा कि @ शून्य 323 ने संकेत दिया है, जो करने का तरीका उपयोग कर रहा है filters पैरामीटर। ये फ़िल्टर लाइब्रेरी द्वारा जाँचे जाते हैं और MongoDB QueryBuilder उपलब्ध फ़िल्टर के विरुद्ध मिलान किए जाते हैं।

स्पार्क- MongoDB से स्रोत कोड:

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))))
)