我有一个RDD
res8: (String,(String,String)) = (CUST1#NODE1#16,(callduration,1))
我需要将其转换为
(String,(String,String,String)) = (CUST1#NODE1,(16,callduration,1))
请告诉我此转换的spark scala代码。
答案 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
}