在大PySpark数据帧的每一行中应用函数?

在大PySpark数据帧的每一行中应用函数?,pyspark,large-scale,Pyspark,Large Scale,我有一个大数据帧(约3000万行)。我有一个函数f。f的任务是遍历每一行,检查一些逻辑并将输出输入字典。该功能需要逐行执行 我试过: dic=dict() 对于df.rdd.collect()中的行: f(世界其他地区,dic) 但我总是遇到错误。我将Docker的内存设置为8GB 我如何才能有效地开展业务 非常感谢通过使用收集可以将火花执行器中的所有数据提取到驱动程序中。您确实应该避免这种情况,因为它会使使用Spark变得毫无意义(在这种情况下,您可以使用普通python) 你能做什么:

我有一个大数据帧(约3000万行)。我有一个函数
f
f
的任务是遍历每一行,检查一些逻辑并将输出输入字典。该功能需要逐行执行

我试过:


dic=dict()
对于df.rdd.collect()中的行:
f(世界其他地区,dic)

但我总是遇到错误。我将Docker的内存设置为8GB

我如何才能有效地开展业务


非常感谢

通过使用
收集
可以将火花执行器中的所有数据提取到驱动程序中。您确实应该避免这种情况,因为它会使使用Spark变得毫无意义(在这种情况下,您可以使用普通python)

你能做什么:

  • 使用现有功能重新实现您的逻辑:

  • 如果由于缺少功能而无法执行第一步,则可以定义


您能试试下面的方法,并告诉我们它是否适合您吗

from pyspark.sql.functions import udf, struct
from pyspark.sql.types import StringType, MapType

#sample data
df = sc.parallelize([
    ['a', 'b'],
    ['c', 'd'],
    ['e', 'f']
]).toDF(('col1', 'col2'))

#add logic to create dictionary element using rows of the dataframe    
def add_to_dict(l):
    d = {}
    d[l[0]] = l[1]
    return d
add_to_dict_udf = udf(add_to_dict, MapType(StringType(), StringType()))
#struct is used to pass rows of dataframe
df = df.withColumn("dictionary_item", add_to_dict_udf(struct([df[x] for x in df.columns])))
df.show()

#list of dictionary elements
dictionary_list = [i[0] for i in df.select('dictionary_item').collect()]
print dictionary_list
输出为:

[{u'a': u'b'}, {u'c': u'd'}, {u'e': u'f'}]
希望这有帮助