我有一个用例,其中我有一组数据(例如:一个csv文件包含约1000万行,约25列)。我有一组规则(大约1000条规则),我需要使用它们来更新记录,这些规则必须顺序执行。
我写了一段代码,其中我循环每个规则,并为每个规则更新数据。
假设规则类似
col1=5 and col2=10 then col25=updatedValue
rulesList.foreach(rule=> {
var data = data.map(line(col1, col2, .., col25) => if(rule){
line(col1, col2, .., updatedValue)
} else {line(col1, col2, .., col25)})
})
这些规则将依次执行,最后a将获得更新的记录。
但问题是,如果规则和数据少于正确执行,但如果数据大于i得到StackOverflow错误,原因可能是因为它映射所有规则并像map-reduce一样最后执行。
尝试在RDD上进行一次映射,并在映射内循环遍历规则,从而减少数据移动。所有规则都将本地应用于生成更新记录的数据—而不是创建1000个rdd
给定RDD中的记录,如果您可以将所有更新增量地应用于它,但独立于其他记录,我建议您先做映射,然后遍历映射内的rulesList:
val result = data.map { case line(col1, col2, ..., col25) =>
var col25_mutable = col25
rulesList.foreach{ rule =>
col25_mutable = if(rule) updatedValue else col25_mutable
}
line(col1, col2, ..., col25_mutable)
}
如果rulesList是一个简单的可迭代对象,比如Array或List,那么这种方法应该是线程安全的。
我希望它对你有用,或者至少能帮助你实现你的目标。
欢呼