Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
从DropResult对象构建Spark JavaRDD列表_Java_Apache Spark - Fatal编程技术网

从DropResult对象构建Spark JavaRDD列表

从DropResult对象构建Spark JavaRDD列表,java,apache-spark,Java,Apache Spark,(Scala中的可能在Java中应该是可能的,对吗?但我也会接受Scala的建议) 我不想迭代RDD,而是需要从一个名为DropResult的随机/模拟器类中构建一个包含n个元素的RDD。DropResult不能用于其他任何内容 我认为Spark“find PI”的例子让我走上了正确的道路,但没有运气。以下是我正在尝试的: 一次性生成的DropResult如下所示: 从pld(PipeLinkageData)生成单个DropResult 我正在尝试这样的事情: JavaRDD<DropRe

(Scala中的可能在Java中应该是可能的,对吗?但我也会接受Scala的建议)

我不想迭代RDD,而是需要从一个名为DropResult的随机/模拟器类中构建一个包含n个元素的RDD。DropResult不能用于其他任何内容

我认为Spark“find PI”的例子让我走上了正确的道路,但没有运气。以下是我正在尝试的:

一次性生成的DropResult如下所示: 从pld(PipeLinkageData)生成单个DropResult

我正在尝试这样的事情:

JavaRDD<DropResult> simCountRDD = spark.parallelize(makeRangeList(1, getSimCount())).foreach(pld.doDrop());
javard simCountRDD=spark.parallelize(makeRangeList(1,getSimCount()).foreach(pld.doDrop());
我只需要在集群上运行pld.doDrop()大约10^6次,并将结果放入Spark RDD中,以便下一次操作,也就是在集群上。我不知道在“并行化”中使用什么样的函数来实现这一点

MakerRangeList:

private List<Integer> makeRangeList(int lower, int upper) {
    List<Integer> range = IntStream.range(lower, upper).boxed().collect(Collectors.toList());
    return range;    
}
私有列表makeRangeList(整数下限,整数上限){
List range=IntStream.range(下、上).boxed().collect(Collectors.toList());
返回范围;
}
(FWIW我试图使用中的Pi示例作为如何执行for循环以创建JavaRDD的模型)

int count=spark.parallelize(makeRange(1,NUM_SAMPLES)).filter(新函数(){
公共布尔调用(整数i){
double x=Math.random();
双y=Math.random();
返回x*x+y*y<1;
}
}).count();
System.out.println(“Pi大致等于”+4*计数/NUM_样本);

是的,看起来你应该可以很容易地做到这一点。听起来您只需要将10^6个整数的RDD并行化,这样就可以在RDD中创建10^6个DropResult对象

如果是这种情况,我认为您不需要像上面那样显式地创建列表。看起来您应该能够像Spark Pi示例那样使用makeRange():

JavaRDD<DropResult> simCountRDD = spark.parallelize(makeRange(1,getSimCount())).map(new Function<Integer, DropResult>() 
{
  public DropResult call(Integer i) { 
     return pld.doDrop(); 
  }
});
JavaRDD simCountRDD=spark.parallelize(makeRange(1,getSimCount()).map(新函数()
{
公共DropResult调用(整数i){
返回pld.doDrop();
}
});

关键是我们首先要尝试并行化填充RDD的过程,我们不能在一台机器上运行这么多计算,因为每台计算大约需要6秒钟。谢谢你的建议,Spark一定能做到这一点?我明白你的意思了,我现在正在测试它,有一件事我不知道MakerRange是否来自一个库?MakerRange需要返回一个数组,我想,看看累加器示例。。。谢谢,我会让你知道的,因为我认为给定带有DropResult的函数,它使parallelize需要一个列表,因为我得到了错误“JavaSparkContext类型中的方法parallelize(List)不适用于参数(int[])”。。。函数还给出“类型new Function(){}必须实现继承的抽象方法Function.apply(Integer)”。。。在Eclipse中进行了清理/保存。由于这需要读回给大师,我想知道累加器是否会工作得更好?是的,我也不知道makeRange()应该来自哪里。在这种情况下,我会尝试使用您原来的方法makeRangeList()方法,因为我看不出累加器有什么帮助:javard simCountRDD=spark.parallelize(makeRangeList(1,getSimCount()).map(新函数(){public DropResult call(Integer I){return pld.doDrop();});我是Spark新手,如果我正确理解累加器,因为累加器是“只写”的,即工人不可读,我认为它们更节省资源,这里只有主人需要读取结果。在这种情况下,我尝试了最后一个建议,我得到了方法映射(函数)在类型AbstractJavaRDDLike中,不适用于映射上的参数(新函数(){}),函数参数上出现错误“类型新函数(){}必须实现继承的抽象方法函数。应用(整数)”。。。真的很感谢你的帮助,我不知道为什么这对我不起作用
int count = spark.parallelize(makeRange(1, NUM_SAMPLES)).filter(new Function<Integer, Boolean>() {
  public Boolean call(Integer i) {
    double x = Math.random();
    double y = Math.random();
    return x*x + y*y < 1;
  }
}).count();
System.out.println("Pi is roughly " + 4 * count / NUM_SAMPLES);
JavaRDD<DropResult> simCountRDD = spark.parallelize(makeRange(1,getSimCount())).map(new Function<Integer, DropResult>() 
{
  public DropResult call(Integer i) { 
     return pld.doDrop(); 
  }
});