地图函数写在全局spark rdd

时间:2017-07-14 16:24:11

标签: scala apache-spark

我有一个字符串的RDD。每行对应各种日志。

我在一个单独的函数中有多个正则表达式,匹配/表示RDD的行以应用适应的正则表达式。

我想在RDD上映射这个独特的函数,因此它可以快速处理每一行,并存储在另一个全局rdd中处理的每一行。

问题是,由于我希望将此任务并行化,因此必须同时访问我的全局RDD才能添加每个已处理的行。

我想知道是否有其他方法可以做到这一点或任何事情!我正在寻求提高我的火花技能。

例如,这就是我想做的事情:

我有一个类似的文本:

  

错误:Hahhaha 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并行化?

1 个答案:

答案 0 :(得分:2)

首先,重要的是要理解Spark中没有“全局RDD”,也没有理由需要这样的东西。使用Spark时,您应该考虑将转换一个RDD转换为另一个RDD而不是更新 RDD(这是不可能的 - RDD 不可变)。每个这样的转换将由Spark分布式(并行)执行。

在这种情况下,如果我正确理解您的要求,您需要map将每条记录转换为以下结果之一:

  • Array[String],其中第一项是"ERROR",或者:
  • Array[String],其中第一项是"WARNING",或者:
  • 如果没有模式与记录匹配,删除

为此,您可以使用map(f)的{​​{1}}和collect(f)方法:

RDD