【问题标题】:how to create a pair rdd with an int key如何使用 int 键创建对 rdd
【发布时间】:2016-06-28 23:29:16
【问题描述】:

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

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

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

(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]+",", ""));
     }

【问题讨论】:

    标签: java apache-spark rdd


    【解决方案1】:

    您的代码甚至可以工作吗? call 的返回类型是 Tuple2&lt;Integer, String&gt;,但是当您创建新的 Tuple2 时,它的类型是 Tuple2&lt;String, String&gt;。要解决此问题,您可以简单地将 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);
    

    【讨论】:

    • 不能修改调用让它返回一个tuple2吗?如果是比怎么做?因为我需要作为整数的键
    • 是的,我扩展了我的答案。
    • 也许这不合逻辑,但我的代码正常工作
    • 现在可以使用@asmaspark 吗?添加比较器后?
    • 我找到了 NumberFormatException 的原因,我没有减去标题 "id,........" 现在它可以工作但没有比较器
    【解决方案2】:

    这是我使用的解决方案:

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

    我完全按照@Matthias Kricke 推荐的方式修改了 keyData 函数

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 1970-01-01
      • 2019-11-29
      • 2020-02-14
      • 2016-08-10
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多