如何在pySpark中处理for循环中的大数据集

时间:2017-08-14 09:02:59

标签: apache-spark pyspark rdd

我知道,当我们触发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)
]

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]))