在pyspark

时间:2019-05-21 14:57:47

标签: python dataframe pyspark rdd nested-loops

我是PySpark的新手,我试图了解如何在PySpark中编写多个嵌套的for循环,我经历了一些现有问题,但没有解决我的问题。任何帮助将不胜感激

FB是一个pyspark RDD,包含200列和06行,而delay是在上一步中计算出的值的列表。 如果需要的话,我会提供。

  s2=[ ['0' for col in range(100)]  for row in range(100)]
  for u in log_progress (range(100)):
      for v in log_progress (range(100)):
          energy=0.0
          for h in log_progress(range(200)):
              z=0.0
              for l in log_progress(range(6)):
                  if h+delay[l][u][v] < 100:
                     m= int(h+delay[l][u][v])
                     z= z + float(str(FB.collect()[l][m]))
                 energy= energy+z*z
    s2[u][v]=round(energy)

调试代码时,可以正确计算能量值,但是将这些值写入s2需要很长时间。我的问题是还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

嵌套的for循环的内容总共称为: #次,您可以提高每个计算的效率,也可以减少计算次数。我有一个想法,可以减少必须执行的计算。

以这种方式进行计算,我认为您可以更有效地处理100*100*200*6 = 12,000,000变量。您可以只构建满足条件h并知道if h+delay[l][u][v]< 100:是什么的h的值,而不是遍历范围的所有200个选项(通过在{{1}之前遍历delay[l][u][v] })我们可以定义一个特定范围的l,u,v值,我们希望使用h进行遍历。

看来,在许多情况下,只有少数几个h值会影响您的解决方案,而其余的则通过for h in log_progress(range(0,int(100-delay[l][u][v])))被忽略,因此从一开始就忽略这些选项可能会加快代码的速度。下面应该按照我的描述进行操作:

h

根据if h+delay[l][u][v]< 100:数据的外观,这应该使您达到200倍的速度,并且绝对不会加速。