[英]Map function to write on global spark rdd
我有一个字符串的RDD。 每行对应各种日志。
我在一个函数中有多个正则表达式,它们匹配/区分RDD的行以应用适应的正则表达式。
我想将此唯一函数映射到我的RDD上,以便它可以快速处理每一行,并将处理过的每一行存储在另一个全局rdd中。
问题是,由于我希望此任务并行化,因此必须可以同时访问我的全局RDD才能添加每个处理的行。
我想知道是否还有其他方法可以做到这一点! 我希望提高我的火花技能。
例如,这就是我想要做的:
我有一个txt:
错误:哈哈哈param_error = 8 param_err2 = https
警告:HUHUHUHUH param_warn = tchu param_warn2 = wifi
我的正则表达式函数会将包含“ ERROR”的行与数组进行匹配,例如Array("Error","8","https")
另一个正则表达式函数将包含数组“ WARNING”的行与数组进行匹配,例如Array("Warning","tchu","wifi")
最后,我想为处理的每一行获取一个RDD[Array[String]]
。
如何使其与Spark并行化?
首先,重要的是要了解,Spark中没有像“全局RDD”这样的东西,也没有理由需要类似的东西。 使用Spark时,应该考虑将一个RDD转换为另一个RDD,而不要考虑更新 RDD(这是不可能的-RDD是不可变的 )。 每个此类转换将由Spark分布式(并行)执行。
在这种情况下,如果我正确理解您的要求,则希望将每个记录map
到以下结果之一:
Array[String]
,其中第一项是"ERROR"
,或者: Array[String]
,其中第一项是"WARNING"
,或者: 为此,您可以使用RDD
的map(f)
和collect(f)
方法:
// Sample data:
val rdd = sc.parallelize(Seq(
"ERROR : Hahhaha param_error=8 param_err2=https",
"WARNING : HUHUHUHUH param_warn=tchu param_warn2=wifi",
"Garbage - not matching anything"
))
// First we can split in " : " to easily identify ERROR vs. WARNING
val splitPrefix = rdd.map(line => line.split(" : "))
// Implement these parsing functions as you see fit;
// The input would be the part following the " : ",
// and the output should be a list of the values (not including the ERROR / WARNING)
def parseError(v: String): List[String] = ??? // example input: "Hahhaha param_error=8 param_err2=https"
def parseWarning(v: String): List[String] = ??? // example input: "HUHUHUHUH param_warn=tchu param_warn2=wifi"
// Now we can use these functions in a pattern-matching function passed to RDD.collect,
// which will transform each value that matches one of the cases, and will filter out
// values that don't match anything
val result: RDD[List[String]] = splitPrefix.collect {
case Array(l @ "ERROR", v) => l :: parseError(v)
case Array(l @ "WARNING", v) => l :: parseWarning(v)
// NOT adding a default case, so records that didn't match will be removed
}
// If you really want Array[String] and not List[String]:
val arraysRdd: RDD[Array[String]] = result.map(_.toArray)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.