检查RDD中是否存在值

2024-04-26 06:44:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了一个正常工作的Spark程序。

但是,从内存消耗的角度来看,它是低效的,我正在尝试优化它。我在AWS EMR上运行它,EMR因为消耗太多内存而终止了工作。

 Lost executor 11 on ip-*****: Container killed by YARN for exceeding memory limits. 11.4 GB of 10.4 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

我认为这个内存问题是由于我在几个实例中收集我的RDD(即使用.collect())造成的,因为在后面的阶段,我需要测试这些RDD组成的列表中是否存在某些值。

所以,目前我的代码如下所示:

myrdd = data.map(lambda word: (word,1))     \
       .reduceByKey(lambda a,b: a+b)   \
       .filter(lambda (a, b): b >= 5) \
       .map(lambda (a,b) : a)          \
       .collect()

稍后在代码中

if word in myrdd:
    mylist.append(word)

myrdd2 = data2.map(lambda word: (word,1))     \
       .reduceByKey(lambda a,b: a+b)   \
       .filter(lambda (a, b): b >= 5) \
       .map(lambda (a,b) : a)          \
       .collect()

if word in myrdd2:
    mylist2.append(word)

然后我重复这个模式多次。

有办法做手术吗

if word in myrdd: 
    do something

不先收集rdd?

是否有类似rdd.contains()的函数?

注:我没有在内存中缓存任何东西。我的spark上下文如下:

jobName = "wordcount"
sc = SparkContext(appName = jobName)

......
......

sc.stop()

Tags: lambda内存inmapifsparkwordcollect

热门问题