-3
我有一個RDD分裂鍵列和移動部分價值列
res8: (String,(String,String)) = (CUST1#NODE1#16,(callduration,1))
我需要改變這個作爲
(String,(String,String,String)) = (CUST1#NODE1,(16,callduration,1))
請告訴我這種轉變火花Scala代碼。
我有一個RDD分裂鍵列和移動部分價值列
res8: (String,(String,String)) = (CUST1#NODE1#16,(callduration,1))
我需要改變這個作爲
(String,(String,String,String)) = (CUST1#NODE1,(16,callduration,1))
請告訴我這種轉變火花Scala代碼。
你可以使用正則表達式#(?=[^#]*$)
拆分最後的#
。如果您對正則表達式不熟悉,?=
是展望未來的語法,[^#]
是一個字符類,它匹配除#
和*
之外的任何字符,這意味着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)))
請出示您已經嘗試了什麼? –