繁体   English   中英

如何使用MapReduce函数通过Spark在Java中排序

[英]How to sort in Java via Spark using the MapReduce functions

嗨,我正在寻找一种在Spark中进行简单排序(使用Java代码)并使用map reduce的方法。 我对此很陌生,因此很好地解释map / reduce的工作原理将非常有帮助。 我读了一些没问题的解释,但完全没有谈论代码,这对我更有用。

我有一个输入数据文件,其中包含数百万个ascii 100字节记录/或更好的100字节二进制记录。 我想对每个记录/行的前10个字节进行排序。 这些文件大约有10 TB,因此其中包含大量数据,我不确定执行此操作最快的方法是什么。 我将如何使用map / reduce做到这一点。 Java不是我的语言,因此写出实际代码将非常有帮助。

我现在要做的就是

SparkConf sparkConf = new SparkConf().setAppName("JavaSparkSimpleSort");
sparkConf.setMaster("local");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
JavaRDD<String> lines = jsc.textFile("hdfs://localhost:19000/hdfsfiles/ASCII500Mill", 10);
lines.sortBy( new Function<String, String>() 
    {  
        @Override
        public String call( String value ) {
          return value.substring(0,10);
        }
    },true,1);


jsc.textFile("hdfs://localhost:19000/hdfsfiles/ASCII500Mill", 10);
jsc.stop();

编辑:所以我仍在努力,确实需要帮助。 我可以很好地执行map函数,创建键,但是那时候我不能只调用sortByKey吗? 我在SO上读到了一些类似的问题/答案,并且似乎还需要减少步骤。 我只是不太了解这些调用在做什么的“为什么”或“如何”,以及我可以做些什么来使其成为我可以制作的最简单的“ MapReduce排序”算法。 我只需要map()。reduce()。sortByKey()或执行此工作所需的任何排序。 任何帮助将不胜感激。

EDIT2:我还看到,在文本文件上使用地图的人们通常(从我所看到的)一直将文本文件拆分为单个单词(其他人通常使用map和textfile所做的事情,以及作为示例给出的Spark Doc / Guide网站)。 我已经在行上排序了(不是单个单词),所以也许我不需要地图? 我知道我正在按键进行排序,但这无非是要使用前十个字节的每一行来返回输入文件的“映射” RDD。 但是话又说回来,我无法追踪原始线条的偏移/位置。 抱歉,这里的无知使我不习惯使用Java进行编程,尤其是与C#相似的委托,尤其是与C#类似的代表,并且不习惯使用FlatMap或Spark,因此我在这里不再赘述。 再次,任何帮助,不胜感激。 谢谢!

我发现这种排序虽然不是通过记录的前十个字节来完成的,但是通过创建一个具有要记录的数字的地图/字典来进行计数,计数然后进行排序。 这并不是我想要的,但它应该可以帮助来到这里的任何人。 我从spark文档中提取了map / reduce部分。

import java.io.*;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.*;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import scala.*;

public class JavaSparkPi {
    public static void main(String[] args) throws Exception {
    SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi");
    sparkConf.setMaster("local");
    JavaSparkContext jsc = new JavaSparkContext(sparkConf);

    JavaRDD<String> lines = jsc.textFile("hdfs://localhost:19000/hdfsfiles/500mill", 10); 
    String s = lines.first();
    System.out.println("First element in UNsorted array: " + s);
    JavaPairRDD<String, Integer> pairs = lines.mapToPair(p -> new Tuple2(p, 1));
    JavaPairRDD<String, Integer> counts = pairs.reduceByKey((a, b) -> a + b);
    JavaPairRDD<String,Integer> sorted = counts.sortByKey();

    s = lines.first();
    System.out.println("First element in sorted array: " + s);
    lines.saveAsTextFile("hdfs://localhost:19000/hdfsfiles/500millOUT4");    
    jsc.stop();
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM