rdd或dataframe apache spark的增量更新



我有一个用例,其中我有一组数据(例如:一个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,那么这种方法应该是线程安全的。

我希望它对你有用,或者至少能帮助你实现你的目标。

欢呼

相关内容

  • 没有找到相关文章

最新更新