我一直试图了解mongo-spark连接器是如何在引擎盖下工作的,但我仍然没有完全了解它背后的整个工作原理。
详情: 我试图使用Mongo-Spark来运行一个主要针对MongoDB集合执行文本搜索的spark作业。 Spark和MongoDB在两个不同的集群上运行
所以我创建了以下Spark-mongo数据框:
entity_df = sqlContext.read.format("com.mongodb.spark.sql.DefaultSource") \
.option("spark.mongodb.input.database", "WikiData") \
.option("spark.mongodb.input.collection", "entities_slim") \
.load()
entity_df.cache()
df = entity_df.filter(entity_df['id'] == "Q2834810").show()
第一条指令是否意味着将entities_slim
集合从MongoDB集群复制到spark集群并表示为Spark DataFrame?
如果是,这是否意味着连接器只是一个只在MongoDB和Spark之间读/写数据的工具?
如果是,有没有办法创建MongoDB引擎运行MongoDB quires的spark作业?类似的东西:
import pymongo
from pyspark import SparkContext
spark_rdd.map(lamda x: entities.find_one( {'id': best} ))
请注意,执行语句entity_df.filter(entity_df['id'] == "Q2834810").show()
的运行速度比使用pymongo
直接查询MongoDB要慢得多
答案 0 :(得分:1)
如果是,这是否意味着连接器只是一个只在MongoDB和Spark之间读/写数据的工具?
在某种程度上,但它并不意味着
正在从MongoDB集群中复制
entities_slim
集合。
选择(过滤器)are converted to aggregation pipelines:
当使用带有DataFrames或Spark SQL的过滤器时,底层的Mongo Connector代码构造一个聚合管道来过滤MongoDB中的数据,然后再将其发送到Spark
此类行为通常适用于数据源API - 如果可能,会将投影和选择下推到源。
回到你的担忧:
请注意,执行语句entity_df.filter(entity_df [' id'] ==" Q2834810")。show()运行速度比使用pymongo直接查询MongoDB要慢得多
这是可以预料的。 Apache Spark和MongoDB聚合管道都不是针对低延迟单项查询而设计的。两者都用于大规模批量处理。如果您需要快速单项访问,请不要首先使用Apache Spark - 这就是您拥有的数据库。
最后如果运行
主要针对MongoDB集合执行文本搜索的作业。
内置的MongoDB文本搜索功能(尽管它们不完美)可能是更好的选择。
答案 1 :(得分:1)
第一条指令是否表示entities_slim集合 从MongoDB集群复制到spark集群和 表示为Spark DataFrame?
是
如果是,这是否意味着连接器只是一个工具 在MongoDB和Spark之间读/写数据?
是
如果是,是否有办法创建运行MongoDB quires的spark作业 MongoDB引擎?
您可能需要在mongodb本身查询mongodb中的数据?您可以将数据处理为spark并将其存储回mongodb