如何使用 int 键创建一对 rdd

how to create a pair rdd with an int key

我是 spark 的新手,我想创建一个 JavaPairRDD 以便能够对其进行排序并在键之间进行比较,因为它显示了下面的代码示例,我尝试创建一个 JavaPairRDD 但是在使用函数 sortByKey( ), 我注意到它将键视为字符串而不是整数。

   JavaRDD<String> csvFileC = sc.textFile(currentFile);
   JavaPairRDD<Integer, String> pairsC = csvFileC.mapToPair(new keyData()).sortByKey(true).cache();

例如,如果 pairsC 包含以下元素:

(1,as),(2,you),(12,er),(3,cu),(22,hh)

所以在使用 sortByKey() 并再次显示它之后我发现它像:

(1,as),(12,er),(2,you),(22,hh),(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]+",", ""));
     }

你的代码还能用吗? call 的 return 类型是 Tuple2<Integer, String>,但是当您创建新的 Tuple2 时,它的类型是 Tuple2<String, String>。要解决此问题,您可以简单地将字符串转换为整数:

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);

这是我使用的解决方案:

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