pyspark映射数据框中的每一行并应用返回数据框的UDF

时间:2019-12-24 11:26:23

标签: pyspark pyspark-sql pyspark-dataframes apache-spark-2.3

我有一个dataframe,其中有几行。我可以使用以下代码遍历dataframe

for row in df.rdd.collect():

但是这不能并行工作,对吗?因此,我要映射每行并将其传递给UDF,然后根据行中的值返回另一个新的数据帧(来自数据库)。

我尝试过 df.rdd.map(lambda行:read_from_mongo(row,spark))。toDF()

但是我得到了这个错误:

  

_pickle.PicklingError:无法序列化对象:异常:您似乎正在尝试从   广播变量,动作或变换。 SparkContext只能   在驱动程序上使用,而不是在工作程序上运行的代码中使用。欲了解更多   信息,请参阅SPARK-5063。

如何并行循环dataframe并保持每行返回的dataframe

1 个答案:

答案 0 :(得分:0)

创建的每个Spark RDD或DataFrame都与应用程序的SparkContext相关联,并且只能在驱动程序代码中引用SparkContext。您的返回数据框架的UDF尝试从工作程序而不是从驱动程序引用SparkContext。那么,为什么需要为每一行创建一个单独的DataFrame?如果 -您希望以后将生成的DataFrame合并为一个。 -第一个DataFrame足够小。 然后,您可以简单地收集DataFrame的内容并将其用作过滤器以从Mongodb返回行。在这里,为了实现并行性,您需要依赖用于连接到Mongodb的连接器。