rdd或dataframe apache spark中的增量更新

时间:2015-07-30 14:11:07

标签: scala apache-spark dataframe apache-spark-sql

我有一个用例,其中我有一组数据(例如:一个包含大约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一样执行。

是否可以使用哪种方式逐步更新此数据。

2 个答案:

答案 0 :(得分:2)

尝试在RDD上进行一次映射,并在地图内部的规则上循环更少的数据移动。所有规则将在本地应用于数据,从而产生更新的记录 - 而不是创建1000个RDD

答案 1 :(得分:0)

鉴于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,那么这种方法应该是线程安全的。

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

干杯