JavaSpark和MongoDB:只查询所需数据
我一直在升级一个JavaSpark项目,从使用txt文件输入升级到从MongoDB读取。我的问题是,我们可以只查询所需的数据吗?例如,我有数百万条记录。我只想获取本周初的记录,并开始对其进行处理 看,他们都是这样开始的:JavaSpark和MongoDB:只查询所需数据,java,mongodb,apache-spark,Java,Mongodb,Apache Spark,我一直在升级一个JavaSpark项目,从使用txt文件输入升级到从MongoDB读取。我的问题是,我们可以只查询所需的数据吗?例如,我有数百万条记录。我只想获取本周初的记录,并开始对其进行处理 看,他们都是这样开始的: // Create a JavaSparkContext using the SparkSession's SparkContext object JavaSparkContext jsc = new JavaSparkContext(spark.sparkCont
// Create a JavaSparkContext using the SparkSession's SparkContext object
JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
// Load data and infer schema, disregard toDF() name as it returns Dataset
Dataset<Row> implicitDS = MongoSpark.load(jsc).toDF();
//使用SparkSession的SparkContext对象创建JavaSparkContext
JavaSparkContext jsc=新的JavaSparkContext(spark.sparkContext());
//加载数据并推断模式,在返回Dataset时忽略toDF()名称
Dataset implicitDS=MongoSpark.load(jsc.toDF();
基本上,MongoSpark将整个集合加载到上下文中,然后将其转换为DF,这意味着即使我只需要本周的1000条记录,程序仍然必须在执行任何其他操作之前获取全部100万条记录。
我想知道是否还有其他东西可以让我直接将查询传递给MongoSpark而不是这样做
多谢各位 数据帧甚至RDD表示一个惰性集合,因此:
Dataset<Row> implicitDS = MongoSpark.load(jsc).toDF();
Dataset implicitDS=MongoSpark.load(jsc.toDF();
不会导致Spark内部发生任何计算,并且不会从MongoDB请求任何数据
只有在执行此操作时,才会触发要处理的数据请求。在此阶段,Mongo Spark连接器将对您请求的数据进行分区,并将分区信息返回给Spark驱动程序。Spark驱动程序将向Spark Worker分配任务,每个Worker将从Mongo Spark连接器请求相关分区
数据帧/数据集的一个很好的特性是,在使用过滤器时,底层Mongo连接器代码构造一个聚合管道,在将数据发送到Spark之前过滤MongoDB中的数据。这意味着并非所有数据都是通过导线发送的!只是你需要的数据
注意事项:确保您使用的是最新的Mongo Spark连接器。此外,还有一种方法可以将过滤器向下推到分区逻辑中。可能会减少空分区的数量并提供进一步的加速。数据帧甚至RDD代表一个惰性集合,因此:
Dataset<Row> implicitDS = MongoSpark.load(jsc).toDF();
Dataset implicitDS=MongoSpark.load(jsc.toDF();
不会导致Spark内部发生任何计算,并且不会从MongoDB请求任何数据
只有在执行此操作时,才会触发要处理的数据请求。在此阶段,Mongo Spark连接器将对您请求的数据进行分区,并将分区信息返回给Spark驱动程序。Spark驱动程序将向Spark Worker分配任务,每个Worker将从Mongo Spark连接器请求相关分区
数据帧/数据集的一个很好的特性是,在使用过滤器时,底层Mongo连接器代码构造一个聚合管道,在将数据发送到Spark之前过滤MongoDB中的数据。这意味着并非所有数据都是通过导线发送的!只是你需要的数据
注意事项:确保您使用的是最新的Mongo Spark连接器。此外,还有一种方法可以将过滤器向下推到分区逻辑中。有可能减少空分区的数量并提供进一步的加速。您可以从我在Spark/Scala/MongoDB中的回答中得到一些启示:在Java中,这样做应该足够了:
ReadConfig.create(sparkSession).withOption(“pipeLine”,yourPipeline)
你可以从我在Spark/Scala/MongoDB中的回答中得到一些启示:在Java中,它应该足够做:ReadConfig.create(sparkSession).withOption(“pipeLine”,yourPipeline)