我需要过滤一个非常大的文本文件(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。我想知道为什么我会在这里出现这种奇怪的行为,正确的方法是什么?
谢谢!