我有一个格式为csv
的大型数据集,我需要对此数据集执行一些RDD操作,而不使用任何DataFrames / Dataset API和SparkSQL。实现这一点,我将每列数据加载到单独的JavaRDD中。
这是我的Sample数据集:
id name address rank
1001 john NY 68
1002 kevin NZ 72
1003 steve WA 64
这是我到目前为止尝试的代码:
JavaRDD<String> diskfile = sc.textFile("/Users/hadoop/Downloads/a.csv");
JavaRDD<String> idRDD=diskfile.flatMap(line -> Arrays.asList(line.split(",")[0]));
JavaRDD<String> nameRDD=diskfile.flatMap(line -> Arrays.asList(line.split(",")[1]));
JavaRDD<String> addressRDD=diskfile.flatMap(line -> Arrays.asList(line.split(",")[2]));
在此之后我在reduceByKey
和addressRDD
上应用了nameRDD
,如下所示:
JavaPairRDD<String,Integer> addresspair=address.mapToPair( t -> new Tuple2 <String,Integer>(t,1)).reduceByKey((x, y) -> x + y);
JavaPairRDD<String,Integer> namepair=nameRDD.mapToPair( t -> new Tuple2 <String,Integer>(t,1)).reduceByKey((x, y) -> x + y);
问题:
我在地址对上应用了soryByVale(交换键值)并获得了一个发生次数最多的地址值(result
)。现在我需要返回所有必需的csv文件列,其中包含地址字段为result
。
答案 0 :(得分:2)
您可以使用下面的filter
。
JavaRDD<String> filteredData = diskfile.filter(add -> add.contains(result));
filteredData.foreach(data -> {
System.out.println(data);
});