如何使用int键创建一对rdd

时间:2016-06-28 23:29:16

标签: java apache-spark rdd

我是新来的火花,我想创建一个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]+",", ""));
     }

2 个答案:

答案 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推荐的那样