我是新来的火花,我想创建一个JavaPairRDD以便能够对它进行排序并在键之间进行比较,因为它显示了代码示例,我尝试创建JavaPairRDD但是在使用函数sortByKey()之后,我注意到它将键视为字符串不是整数。
JavaRDD<String> csvFileC = sc.textFile(currentFile);
JavaPairRDD<Integer, String> pairsC = csvFileC.mapToPair(new keyData()).sortByKey(true).cache();
例如,如果pairsC包含以下元素:
(1,如),(2,你),(12,ER),(3,CU),(22,11H)
所以在使用sortByKey()并再次显示后,我发现它像:
(1,如),(12,ER),(2,你),(22,11H),(3,CU)
这意味着它将键视为字符串而不是整数,但我查找的结果如下:
(1,as),(2,you),(3,cu),(12,er),(22,hh)
那么如何处理我的键作为int? 有关更多详细信息,这是我用来将RDD转换为PairRDD的函数keyData
public static class keyData implements PairFunction <String, Integer, String>
{
public Tuple2<Integer, String> call(String x) {
String[] strs = x.split(",");
return new Tuple2(strs[0], x.replaceFirst(strs[0]+",", ""));
}
答案 0 :(得分:0)
您的代码是否有效? call
的返回类型为Tuple2<Integer, String>
,但在您创建新Tuple2
时,其类型为Tuple2<String, String>
。要解决此问题,您可以简单地将String转换为Integer:
return new Tuple2(Integer.parseInt(strs[0]), x.replaceFirst(strs[0]+",", ""));
此外,请确保您的第一个拆分元素中只有整数。通常,如果存在,则必须删除或跳过文件的标题以避免NumberFormatExceptions
。
但是,请为sortByKey
提供一个比较器,以查看JavaDocs以获取更多信息。这将导致类似:
JavaPairRDD<Integer, String> parisC =
csvFileC.sortByKey(Comparator.comparing(tuple2 -> tuple2._1, true);
答案 1 :(得分:0)
这是我使用的解决方案:
String headerSTR = "Id,Name,Color,Age";
JavaRDD<String> header = sc.parallelize(Arrays.asList(headerSTR));
String currentFile = "C:/Users/pc/Desktop/source.csv";
JavaRDD<String> csvFileC = c.textFile(currentFile).subtract(header);
JavaPairRDD<Integer, String> pairsC = csvFileC.mapToPair(new keyData()).sortByKey(true).cache();
我修改了keyData函数,就像@Matthias Kricke推荐的那样