根据Condtion

时间:2018-03-08 20:13:18

标签: apache-spark java-8 rdd

我有一个 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实现这一目标?

1 个答案:

答案 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方法中使用的不同键进行划分。