我有一个 JavaRdd记录 我想根据条件从记录中创建 3 JavaRdd :
JavaRdd<MyClass> records1 =records1.filter(record -> “A”.equals(record.getName()));
JavaRdd<MyClass> records2 =records1.filter(record -> “B”.equals(record.getName()));
JavaRdd<MyClass> records13=records1.filter(record -> “C”.equals(record.getName()));
问题是,我可以像上面所示那样做,但我的记录可能有数百万条记录,而且我不想扫描所有记录3次。 所以我想在记录上进行一次迭代。
我需要这样的东西:
records
.forEach(record -> {
if (“A”.equals(records.getName()))
{
records1(record);
}
else if (“B”.equals(records.getName()))
{
records2(record);
}
else if (“C”.equals(records.getName()))
{
records3(record);
}
});
如何在Spark中使用JavaRDD实现这一目标?
答案 0 :(得分:1)
在我的想法中你可以使用&#34; MapToPair&#34;并在每个if条件块中新建一个Tuple2对象。然后你在Tuple2中的键将帮助你找到每个rdd对象类型。换句话说,Tuple2s键显示您想要存储在一个rdd中的对象的类型,它的值是您的主要数据。
您的代码如下所示:
JavaPairRdd<String,MyClass> records1 =records.forEach(record -> {
String key = "";
if (“A”.equals(record.getName()))
{
key="A";
}
else if ("B".equals(record.getName()))
{
key="B";
}
else if ("C".equals(record.getName()))
{
key="C";
}
return new Tuple2<>(key, record);
});
生成的pairrdd对象可以用您在foreach方法中使用的不同键进行划分。