2017-04-04 43 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