拆分键列并将部件移动到值列

时间:2017-02-13 02:45:27

标签: scala dictionary apache-spark

我有一个RDD

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

我需要将其转换为

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

请告诉我此转换的spark scala代码。

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式#拆分最后#(?=[^#]*$)。如果你不熟悉正则表达式,?=是一个预见语法,[^#]是一个匹配任何字符的字符类,除了#*是量词,这意味着0或更多,$匹配字符串的结尾,因此组合在一起,[^#]*$匹配字符串末尾的模式,该模式不包含任何#,这使#(?=[^#]*$)成为# 1}}匹配字符串中的最后一个#;

在第一个元素被最后一个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))) 上映射上述转换:

function getText(htmlString) {
       const virtual = document.createElement('div');
       virtual.innerHTML = htmlString;
       return virtual.textContent
}