使用JavaRDD <string>进行Spark排序

时间:2018-04-25 18:06:57

标签: java apache-spark

让我说我有一个带字符串的文件,我将它导入JavaRDD,如果我试图对字符串进行排序并导出为新文件,我应该怎么做?下面的代码是我的尝试,它无法正常工作

JavaSparkContext sparkContext = new JavaSparkContext("local[*]", "Spark Sort");
Configuration hadoopConfig = sparkContext.hadoopConfiguration();
hadoopConfig.set("fs.hdfs.imp", DistributedFileSystem.class.getName());
hadoopConfig.set("fs.file.impl", LocalFileSystem.class.getName());
JavaRDD<String> lines = sparkContext.textFile(args[0]);
JavaRDD<String> sorted = lines.sortBy(i->i, true,1);
sorted.saveAsTextFile(args[1]);

我的意思是&#34;不工作&#34;是输出文件没有排序。我认为问题出在我的&#34; i-&gt; i&#34;代码,我不知道如何使用字符串的比较方法对它进行排序,因为每个&#34; i&#34;将是一个字符串(也不知道如何比较不同的&#34;我&#34;

修改 我根据评论修改了代码,我怀疑该文件被读作1个巨大的字符串。

JavaSparkContext sparkContext = new JavaSparkContext("local[*]", "Spark Sort");
Configuration hadoopConfig = sparkContext.hadoopConfiguration();
hadoopConfig.set("fs.hdfs.imp", DistributedFileSystem.class.getName());
hadoopConfig.set("fs.file.impl", LocalFileSystem.class.getName());
long start  = System.currentTimeMillis();

List<String> array = buildArrayList(args[0]);
JavaRDD<String> lines = sparkContext.parallelize(array);
JavaRDD<String> sorted = lines.sortBy(i->i, true, 1);
sorted.saveAsTextFile(args[1]);

还没有排序:(

1 个答案:

答案 0 :(得分:0)

我做了一点研究。你的代码是正确的。以下是我测试的样本:

Spark初始化

SparkSession spark = SparkSession.builder().appName("test")
        .config("spark.debug.maxToStringFields", 10000)
        .config("spark.sql.tungsten.enabled", true)
        .enableHiveSupport().getOrCreate();

JavaSparkContext jSpark = new JavaSparkContext(spark.sparkContext());

RDD示例

//RDD
JavaRDD rdd = jSpark.parallelize(Arrays.asList("z", "b", "c", "a"));
JavaRDD sorted = rdd.sortBy(i -> i, true, 1);
List<String> result = sorted.collect();
result.stream().forEach(i -> System.out.println(i));

输出

a
b
c
z

您也可以使用数据集API //数据集

Dataset<String> stringDataset = spark.createDataset(Arrays.asList("z", "b", "c", "a"), Encoders.STRING());
Dataset<String> sortedDataset = stringDataset.sort(stringDataset.col(stringDataset.columns()[0]).desc()); //by defualt is ascending order
result = sortedDataset.collectAsList();
result.stream().forEach(i -> System.out.println(i));

输出

z
c
b
a

我的问题我认为你的文本文件有一个特定的行分隔符。如果是这样的话 - 您可以使用flatMap函数将巨型文本字符串拆分为行字符串。 这里是Dataset的例子 // flatMap示例

Dataset<String> singleLineDS= spark.createDataset(Arrays.asList("z:%b:%c:%a"),  Encoders.STRING());
Dataset<String> splitedDS = singleLineDS.flatMap(i->Arrays.asList(i.split(":%")).iterator(),Encoders.STRING());
Dataset<String> sortedSplitedDs = splitedDS.sort(splitedDS.col(splitedDS.columns()[0]).desc());
result = sortedSplitedDs.collectAsList();
result.stream().forEach(i -> System.out.println(i));

因此,您应该在文本文件中找到哪个分隔符并采用上面的代码来完成任务