2017-02-13 68 views
-3

我有一個RDD分裂鍵列和移動部分價值列

res8: (String,(String,String)) = (CUST1#NODE1#16,(callduration,1)) 

我需要改變這個作爲

(String,(String,String,String)) = (CUST1#NODE1,(16,callduration,1)) 

請告訴我這種轉變火花Scala代碼。

+1

請出示您已經嘗試了什麼? –

回答

1

你可以使用正則表達式#(?=[^#]*$)拆分最後的#。如果您對正則表達式不熟悉,?=是展望未來的語法,[^#]是一個字符類,它匹配除#*之外的任何字符,這意味着0或更多的量詞,$匹配字符串的末尾,所以組合在一起,[^#]*$匹配不包含任何#的字符串末尾的模式,這使得#(?=[^#]*$)匹配字符串中的最後一個#;

在第一個元素被最後一個#拆分後,可以使用拆分元素重構元組。

給出一個數組:

val t = ("CUST1#NODE1#16",("callduration","1")) 
// t: (String, (String, String)) = (CUST1#NODE1#16,(callduration,1)) 

t match { 
    case (x, y) => { 
     val Array(l, r) = x.split("#(?=[^#]*$)") 
     (l, (r, y._1, y._2)) 
    } 
} 
// res8: (String, (String, String, String)) = (CUST1#NODE1,(16,callduration,1)) 

給定一個RDD,該過程是類似的,可以用地圖rdd上述轉變:

val rdd = sc.parallelize(Seq(t)) 

rdd.map(_ match { 
    case (x, y) => { 
     val Array(l, r) = x.split("#(?=[^#]*$)") 
     (l, (r, y._1, y._2)) 
}}).collect 

// res11: Array[(String, (String, String, String))] = Array((CUST1#NODE1,(16,callduration,1)))