我知道,当我们触发collect()时,如果数据集太大而无法放入内存,则由于内存问题,spark会崩溃。那么在下面的一个案例中,正确的方法是什么。
我有一个rdd fmap,而fmap的尺寸更大。如果我想在for循环中进行一些处理,如果数据集的平均大小,波纹管将起作用。 如果数据集的大小较大,那么最佳方法
for x,(k,v) in fmap.collect():
st = x + " " + k + " " + str(v)
mynewList.append(st)
我的目的是格式化数据
My RDD
[
('HOMICIDE', ('2017', 1)),
('DECEPTIVE PRACTICE', ('2015', 10)),
('DECEPTIVE PRACTICE', ('2014', 3)),
('DECEPTIVE PRACTICE', ('2017', 14)),
('ROBBERY', ('2017', 1))
]
Expected result
=============
[
('HOMICIDE', '2017', 1),
('DECEPTIVE PRACTICE', '2015', 10),
('DECEPTIVE PRACTICE', '2014', 3),
('DECEPTIVE PRACTICE', '2017', 14),
('ROBBERY', '2017', 1)
]
答案 0 :(得分:2)
TL; DR Don&#t; t collect
。我这样做,并且在驱动程序上处理数据,没有理由使用Spark。 collect
对测试非常有用,但在其他方面的价值可以忽略不计。
只需使用map
即可。 Python 2:
rdd.map(lambda (x, (k,v)): x + " " + k + " " + str(v))
Python 3:
rdd.map(lambda xkv: xkv[0] + " " + xkv[1][0] + " " + str(xkv[1][1]))
版本无关:
def f(xkv):
(x, (k, v)) = xkv
return x + " " + k + " " + str(v)
rdd.map(f)
获取tuples
替换:
x + " " + k + " " + str(v)
使用:
(x, k, v)
或
(xkv[0], xkv[1][0], str(xkv[1][1]))