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
如何使用JavaSpark有效地处理数百万条记录_Java_Apache Spark_Bigdata - Fatal编程技术网

如何使用JavaSpark有效地处理数百万条记录

如何使用JavaSpark有效地处理数百万条记录,java,apache-spark,bigdata,Java,Apache Spark,Bigdata,我是JavaSpark的新手 我需要比较和处理数百万条记录,我使用了纯java多线程,但我想用spark的方式来提高性能 问题陈述: 我们的数据库中有数百万条记录,我需要将其与另一个列表进行比较并进行处理。 示例: 步骤1:我们有一个列表1,其中包含从文件系统获取的一百万个字符串(这没有问题)。 步骤2:我们正在从数据库中获取另外一百万条记录并添加到列表2中。 步骤3:迭代并比较List1元素和List2(如果List2中存在List1元素,则更新数据库中的List2元素) 挑战 第2步和第3步

我是JavaSpark的新手
我需要比较和处理数百万条记录,我使用了纯java多线程,但我想用spark的方式来提高性能

问题陈述:
我们的数据库中有数百万条记录,我需要将其与另一个列表进行比较并进行处理。
示例:
步骤1:我们有一个列表1,其中包含从文件系统获取的一百万个字符串(这没有问题)。
步骤2:我们正在从数据库中获取另外一百万条记录并添加到列表2中。
步骤3:迭代并比较List1元素和List2(如果List2中存在List1元素,则更新数据库中的List2元素)
挑战
第2步和第3步花了很多时间,如何将这个问题语句转换成JavaSpark来提高性能

我试过什么

List paths (this contains million strings)
Iterator<T> oneMillionRecords =
        database.fetching();// this is taking time
                Iterable<T> iterable = () -> oneMillionRecords;
JavaRDD<T> parentPathRDDs = javaSparkContext.parallelize(
              StreamSupport.stream(iterable.spliterator(), false)
                           .collect(Collectors.toList()));

List<T> avaliableResources = parentPathRDDs.filter(r -> {
    return paths.contains(r.getPath()));
}).map(dr->{dr.setXXX("YYY"); return dr;}).collect();

List<T> unreachableResources = parentPathRDDs.filter(r -> {
    return (!paths.contains(r.getPath())));
}).map(dr->{dr.setX("ZZZ"); return dr;}).collect();

List<T> allRes = new ArrayList<>();
allRes.addAll(avaliableResources);
allRes.addAll(unreachableResources);
resourcesToUpdate.addAll(allRes); 
列出路径(包含一百万个字符串)
迭代器百万记录=
database.fetching();//这需要时间
Iterable Iterable=()->一百万条记录;
JavaRDD parentPathRDDs=javaSparkContext.parallelize(
StreamSupport.stream(iterable.spliterator(),false)
.collect(Collectors.toList());
List AvailableResources=parentPathRDDs.filter(r->{
包含(r.getPath());
}).map(dr->{dr.setXXX(“YYY”);返回dr;}).collect();
列出无法访问的资源=parentPathRDDs.filter(r->{
返回(!paths.contains(r.getPath()));
}).map(dr->{dr.setX(“ZZZ”);返回dr;}).collect();
List allRes=new ArrayList();
allRes.addAll(可用资源);
allRes.addAll(无法访问的资源);
resourcesToUpdate.addAll(allRes);

上面的代码对性能没有太大影响,有人能提出更好的解决方案吗

您应该通过让Spark直接从数据库中读取来创建
parentPathRDD
。可能还有其他的
过滤器
您正在运行的代码已经可以在数据库中执行。路径有数百万条记录,无法发送查询来在数据库中执行该操作(因为我正在检查路径中是否包含每个行元素)。在我看来,主要的好处是通过使用Spark读取来生成
parentPathRDD
。关于
路径
,如果调用1M元素列表中的
.contains
,可能是做错了什么。关于这一点,我要做的第一件事是将
路径
也作为RDD,并执行内部连接。如果你不能做到这一点,那么至少使用一个
HashSet
而不是一个(any)
列表。您可以使用输入文件中每个元素的UPDATE语句执行步骤3。此外,如果字符串是数据库主字符串,则可以通过按键顺序成批处理更新来获得良好的加速。