【问题标题】:Filter JavaRDD into multiple JavaRDD based on Condtion根据 Condition 将 JavaRDD 过滤成多个 JavaRDD
【发布时间】:2018-03-09 06:56:22
【问题描述】:

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

【问题讨论】:

    标签: apache-spark java-8 rdd


    【解决方案1】:

    在我的想法中,您可以在每个 if 条件块中使用“MapToPair”并新建一个 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 方法中使用的不同键进行划分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2020-06-01
      • 2017-02-25
      • 2019-12-23
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      相关资源
      最近更新 更多