无法在Spark foreach函数体内更改全局变量

时间:2018-10-20 14:49:10

标签: scala apache-spark pyspark

我需要过滤一个非常大的文本文件(500GB),然后使用Spark导出结果。

这里的问题是它太大了,无法容纳内存中的所有内容,因此我必须使用全局缓冲的写入器,每写入500000条记录,该写入器就会被刷新。

直观上,我使用了RDD的foreach函数并将一个函数传递给它,例如(在pyspark中):

# global definitions
def fn(x);
    global counter, writer
    # some logic to generate data
    if counter == 500000:
        writer.write(data)
        writer.flush_buf()
        counter = 1
    else:
        counter = counter + 1
txt_file.foreach(fn)
# write final data

但是,这里可变计数器没有被更新。

最初,我认为这可能与python-scala桥有关,然后用scala重写了一些测试代码:

var value = 10
def fn(x: Int) = {
    value = 20
}
sc.parallelzie(Seq(1, 2, 3, 4, 5), 5).foreach(fn)
println(value)

令我惊讶的是,我仍然获得了价值= 10。我想知道为什么我会在这里出现这种奇怪的行为,正确的方法是什么?

谢谢!

0 个答案:

没有答案