Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSpark和MongoDB:只查询所需数据_Java_Mongodb_Apache Spark - Fatal编程技术网

JavaSpark和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

我一直在升级一个JavaSpark项目,从使用txt文件输入升级到从MongoDB读取。我的问题是,我们可以只查询所需的数据吗?例如,我有数百万条记录。我只想获取本周初的记录,并开始对其进行处理

看,他们都是这样开始的:

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