Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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
使用JavaRDD的Spark排序<;字符串>;_Java_Apache Spark - Fatal编程技术网

使用JavaRDD的Spark排序<;字符串>;

使用JavaRDD的Spark排序<;字符串>;,java,apache-spark,Java,Apache Spark,假设我有一个包含一行字符串的文件,我将它导入到一个JavaRDD,如果我试图对字符串进行排序并导出为一个新文件,我应该怎么做?下面的代码是我的尝试,它不起作用 JavaSparkContext sparkContext = new JavaSparkContext("local[*]", "Spark Sort"); Configuration hadoopConfig = sparkContext.hadoopConfiguration(); hadoopConfig.set("fs.hdfs

假设我有一个包含一行字符串的文件,我将它导入到一个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]);
JavaSparkContext-sparkContext=newjavasparkcontext(“local[*]”,“Spark Sort”);
配置hadoopConfig=sparkContext.hadoopConfiguration();
hadoopConfig.set(“fs.hdfs.imp”,DistributedFileSystem.class.getName());
hadoopConfig.set(“fs.file.impl”,LocalFileSystem.class.getName());
JavaRDD lines=sparkContext.textFile(args[0]);
JavaRDD sorted=lines.sortBy(i->i,true,1);
saveAsTextFile(args[1]);
我所说的“不工作”是指输出文件没有排序。我认为问题在于我的“I->I”代码,我不确定如何使用字符串的比较方法进行排序,因为每个“I”都将是一个字符串(也不确定如何在不同的“I”之间进行比较)

编辑 我已经根据注释修改了代码,我怀疑该文件被读取为一个巨大的字符串

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]);
JavaSparkContext-sparkContext=newjavasparkcontext(“local[*]”,“Spark Sort”);
配置hadoopConfig=sparkContext.hadoopConfiguration();
hadoopConfig.set(“fs.hdfs.imp”,DistributedFileSystem.class.getName());
hadoopConfig.set(“fs.file.impl”,LocalFileSystem.class.getName());
长启动=System.currentTimeMillis();
列表数组=buildArrayList(args[0]);
javarddlines=sparkContext.parallelize(数组);
JavaRDD sorted=lines.sortBy(i->i,true,1);
saveAsTextFile(args[1]);

仍然没有排序:(

我做了一些研究。您的代码是正确的。以下是我测试的示例:

火花初始化

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));
您还可以使用数据集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));
我认为您的问题是,您的文本文件有一个特定的行分隔符。如果是这样,您可以使用flatMap函数将巨大的文本字符串拆分为行字符串。 下面是使用Dataset的示例 //平面图示例

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));
Dataset singleLineDS=spark.createDataset(Arrays.asList(“z:%b:%c:%a”),Encoders.STRING();
Dataset splitedDS=singleLineDS.flatMap(i->Arrays.asList(i.split(“:%”)).iterator(),Encoders.STRING();
数据集sortedSplitedDs=splitedDS.sort(splitedDS.col(splitedDS.columns()[0]).desc());
结果=sortedSplitedDs.collectAsList();
result.stream().forEach(i->System.out.println(i));

因此,您应该找到文本文件中的分隔符,并采用上面的代码执行任务

您的代码正确读取文本文件吗?您正在尝试从本地文件系统或hdfs读取文件吗?您是否尝试在每个步骤后调用show()方法?我没有调用show()在每一步之后。它确实正确地读取了文件,并且输出的格式正确,只是没有分类。我感觉spark将文件的内容读取为单个字符串。您可以调用collectAsList获取此列表的大小?我也这样认为,并用新代码更新了问题Scala DataFrames如何?:)
z
c
b
a
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));