在Scala-Spark1.5.2

时间:2017-04-04 11:53:49

标签: scala apache-spark rdd

我有一个包含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中的每个结果?

1 个答案:

答案 0 :(得分:2)

您可能想要的(在您的map方法中)类似于

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

但是,dropRightWhile不是Seq上的方法,因此您可能需要在此处理之前和之后执行reverse,如下所示:

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