我有一个包含50列的RDD,我想为每一行获取第一个元素和最后5个列,其中最后一行的第一个字符的值是一个数字,如果是最后一列的第一个字符是一个角色,继续迭代这个过程。例如,假设原始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中的每个结果?
答案 0 :(得分:2)
您可能想要的(在您的map
方法中)类似于
row.dropRightWhile(cell => !cell(0).isDigit)
但是,dropRightWhile
不是Seq
上的方法,因此您可能需要在此处理之前和之后执行reverse
,如下所示:
row.reverse.dropWhile(cell => !cell(0).isDigit).reverse