簡體   English   中英

在Scala-Spark1.5.2中遞歸過濾RDD

[英]Filter recursively an RDD in Scala-Spark1.5.2

我有一個具有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中?

您可能想要的(在您的map方法中)類似於

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

但是, dropRightWhile不是Seq上的方法,因此您可能需要在此處理之前和之后進行以下reverse

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM