Python 更换pyspark中的循环到并行过程
我在脚本中使用for循环为大小为_DF(数据帧)的每个元素调用一个函数,但这需要很多时间。我尝试按映射删除for循环,但没有得到任何输出。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
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
也使用workerforEach
相当于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)