2017-04-04 46 views
1

我有一个RDD,其中有50列,我想为每行获得第一个元素和最后5行的第一个字符的值为数字的最后5列如果最后一列的第一个字符是一个字符,则继续反复执行此过程。例如,让我们假设原来的RDD具有以下内容(密钥不包括以使其更易于阅读):在Scala-Spark1.5.2中递归地过滤RDD

[45 first values], 1, 2, a, 3, 4 
[44 first values], 0, 1, 2, 3, 4, b 
[43 first values], 10, 11, 12, 13, 14, q, a 

改造后所需的输出将是:

1, 2, a, 3, 4 
0, 1, 2, 3, 4 
10, 11, 12, 13, 14 

我设法用下面的句子RDD输入的最后一个元素过滤:

var aux = rdd.map(row => row.slice(0, 1) ++ row.slice(45, 50)).filter(elem => elem(5)._2(0).isDigit == true) 

按照以下语法,我还可以过滤原始RDD的-nth元素:

var aux = rdd.map(row => row.slice(0, 1) ++ row.slice(44, 50)).filter(elem => elem(5)._2(0).isDigit == true).map(_.slice(0,6)) 

我的问题是,是否有任何可能的方式中的一对或句子执行此迭代指定范围的地图和/或在过滤器或类似的东西的内部元件,并且执行此过程或者是它需要将每个句子的结果保存在一个辅助变量中,然后尝试将每个单独的结果合并到一个新的RDD中?

回答

2

你可能要(在你的map方法)什么是一样的东西

row.dropRightWhile(cell => !cell(0).isDigit) 

但是,dropRightWhile不上Seq的方法,所以你可能需要该处理之前和之后如下做reverse

row.reverse.dropWhile(cell => !cell(0).isDigit).reverse 
+0

非常感谢,我不知道这很容易 – qwerty