如何使用 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 推荐的那样
我是 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 推荐的那样