Python 更换pyspark中的循环到并行过程

Python 更换pyspark中的循环到并行过程,python,apache-spark,pyspark,pyspark-sql,Python,Apache Spark,Pyspark,Pyspark Sql,我在脚本中使用for循环为大小为_DF(数据帧)的每个元素调用一个函数,但这需要很多时间。我尝试按映射删除for循环,但没有得到任何输出。 size_DF是我从表中获取的大约300个元素的列表 用于: import call_functions newObject = call_functions.call_functions_class() size_RDD = sc.parallelize(size_DF) if len(size_DF) == 0: print "No rec

我在脚本中使用for循环为大小为_DF(数据帧)的每个元素调用一个函数,但这需要很多时间。我尝试按映射删除for循环,但没有得到任何输出。
size_DF是我从表中获取的大约300个元素的列表

用于:

import call_functions

newObject = call_functions.call_functions_class()
size_RDD = sc.parallelize(size_DF) 

if len(size_DF) == 0:
    print "No record present in the truncated list"
else:

    for row in size_DF:
        length = row[0]
        print "length: ", length
        insertDF = newObject.full_item(sc, dataBase, length, end_date)
使用地图

if len(size_DF) == 0:
    print "No record present in the list"
else:
    size_RDD.mapPartition(lambda l: newObject.full_item(sc, dataBase, len(l[0]), end_date))
新建对象。完整项目(sc、数据库、len(l[0])、结束日期) 在full_item()中——我正在执行一些select操作,连接两个表,并将数据插入一个表中


请帮助我,让我知道我做错了什么。

pyspark.rdd.rdd.mapPartition
方法是惰性评估的。 通常,为了强制求值,您可以创建一个方法,该方法在返回的惰性RDD实例上返回一个值

有更高级别的函数负责强制计算
RDD
例如

因为您并不真正关心操作的结果,所以可以使用
pyspark.rdd.rdd.foreach
而不是
pyspark.rdd.rdd.mapPartition

def first_of(it):
    for first in it:
        return first
    return []

def insert_first(it):
    first = first_of(it)
    item_count = len(first)
    newObject.full_item(sc, dataBase, item_count, end_date)


if len(size_DF) == 0:
    print('No record present in the truncated list')
else:
    size_DF.forEach(insert_first)

完整项目(sc、数据库、长度、结束日期)
具体做什么?您需要使用尽可能多的信息更新问题。您没有保存
size\RDD的输出。mapPartition
是否需要任何
newObject的结果。完整项目是否分配给insertDF?或者您只需要为每个分区运行
newObject.full_item
例程,而不关心结果吗?正如问题中更新的newObject.full_item(sc、数据库、len(l[0])、full_item()中的结束日期)--我们正在执行一些select操作,我们正在连接两个表并将数据插入一个表。@Oluwafemi Sule No我不需要,但使用for()和forEach()需要花费很多时间。我只想使用spark rdd的并行处理概念,这就是我使用.mapPartitions()的原因。
forEach
foreachPartition
也使用worker
forEach
相当于
mapPartitions(func).count()
这是一个什么函数,用于(it)的def first_:?
first_of
函数返回iterable中的第一项,而不消耗内存中的整个迭代。。。但是我想将size_DF的每个元素的长度传递给如下函数,用于size_DF中的行:length=row[0]print“length:,length insertDF=newObject.full_项(sc,dataBase,length,end_date)