如何管道()按密钥RDD分组?

时间:2017-10-04 01:24:50

标签: java apache-spark

到目前为止,我已完成了以下工作流路径:

1) JavaPairRDD< Integer, String > aRDD = fooRDD.mapToPair( )

2) JavaPairRDD< Integer, Iterable< String > > bRDD = aRDD.groupByKey( )

3) JavaPairRDD< Integer, List<String> > cRDD = bRDD.mapToPair( )

现在我遇到了问题:我需要cRDD.pipe('myscript.sh'),但我注意到myscript.sh一次收到每个密钥的所有列表。

长版本:有一个bash脚本,它将获取每组行并使用数据创建PDF。因此,bRDD将使用密钥对行进行分组,cRDD将对每个组内的一些不需要的数据进行排序和删除,下一步将为每个数据组创建一个PDF报告。

我正在考虑将代表群组内容的List<String>转换为每个群组的新JavaPairRDD< Integer, String >,但我不知道如何做到这一点,即使这是正确的方法。

示例:

(1,'foo,b,tom'), (1,'bar,c,city'), (1,'fly,Marty'), (2,'newFoo,Jerry'), (2,'newBar,zed,Mark'), (2,'newFly,boring,data') (2,'jack,big,deal')

在groupBy之后:

(1, 'foo,b,tom','bar,c,city','fly,Marty') 
(2, 'newFoo,Jerry','newBar,zed,Mark','newFly,boring,data','jack,big,deal')

如何`myscript.sh&#39;正在获取数据(注意整个组的一个字符串):

(1,['foo,b,tom,bar,c,city,fly,Marty'])

(2,['newFoo,Jerry,newBar,zed,Mark,newFly,boring,data,jack,big,deal'])

我希望如何收到:

对于分区1或工作人员1:

1,'foo,b,tom'
1,'bar,c,city'
1,'fly,Marty'

对于分区2或工作人员2:

2,'newFoo,Jerry'
2,'newBar,zed,Mark'
2,'newFly,boring,data'
2,'jack,big,deal'

所以我可以一次处理每一行,但仍保留该组,并确保这将使第1组转到一个PDF报告,第2组转到另一个报告。主要问题是我的数据行已经是逗号分隔数据然后我无法确定从哪里开始新的行值,因为所有行也合并为逗号分隔行。

我正在使用Java。请用Java解答你的答案。

1 个答案:

答案 0 :(得分:1)

您无法在RDD中创建RDD。如果要连续处理属于特定键的所有记录,则不应再次使用flatMap分组RDD(bRDD,cRDD)。相反,我建议将分组RDD(bRDD,cRDD)值分隔符更改为其他字符。

e.g。

cRDD.map(s->{
            StringBuilder sb =new StringBuilder();
           Iterator<String> ite = s._2().iterator();
            while (ite.hasNext()){
                //change delimiter to colon(:) or some other character
                sb.append(ite.next()+":");
            }
            return new Tuple2<Long,String>(s._1(),sb.toString());
        }).pipe('myscript.sh');

在基于冒号(:)的myscript.sh拆分记录中。我希望这会有所帮助。