繁体   English   中英

rdd或Dataframe Apache Spark中的增量更新

[英]Incremental update in rdd or dataframe apache spark

我有一个用例,其中有一组数据(例如:一个包含约1000万行和约25列的csv文件)。 我有一组规则(大约1000条规则),使用它们需要更新记录,并且这些规则必须按顺序执行。

我写了一个代码,在其中我为每个规则循环并为每个规则更新数据。

假设规则就像

col1 = 5和col2 = 10,然后col25 = updatedValue

rulesList.foreach(rule=> {
    var data = data.map(line(col1, col2, .., col25) => if(rule){
        line(col1, col2, .., updatedValue)
    } else {line(col1, col2, .., col25)})
})

这些规则将按顺序执行,最后将获得更新的记录。

但是问题是,如果规则和数据少于它可以正确执行的大小,但是如果数据大于我得到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),则此方法应该是线程安全的。

我希望它对您有用,或者至少可以帮助您实现目标。

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM