pyspark映射dataframe中的每一行,并应用返回dataframe的UDF

pyspark映射dataframe中的每一行,并应用返回dataframe的UDF,pyspark,pyspark-sql,pyspark-dataframes,apache-spark-2.3,Pyspark,Pyspark Sql,Pyspark Dataframes,Apache Spark 2.3,我有一个数据帧,有多行。我可以使用以下代码循环此dataframe: df.rdd.collect()中的行的: 但这是不平行的,对吗?所以我想要的是映射每一行,并将其传递给UDF,然后根据行中的值返回另一个新的数据帧(来自DB) 我试过了 df.rdd.map(lambda行:从mongo(row,spark)读取)。toDF() 但我有一个错误: _pickle.PicklingError:无法序列化对象:异常:似乎您正试图从中引用SparkContext 广播变量、动作或转换。SparkC

我有一个
数据帧
,有多行。我可以使用以下代码循环此
dataframe

df.rdd.collect()中的行的

但这是不平行的,对吗?所以我想要的是映射每一行,并将其传递给UDF,然后根据行中的值返回另一个新的数据帧(来自DB)

我试过了 df.rdd.map(lambda行:从mongo(row,spark)读取)。toDF()

但我有一个错误:

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


如何并行循环
数据帧
,并保持每行返回的
数据帧?

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

这是否回答了您的问题?我用mongo spark连接器读取数据。我可以先收集行来循环该行。我想知道的是,由于每一行都有独立的值,所以有可能并行化该循环。特别是关于该循环,由于全局解释器锁,在Python中,不可能在集合上完全并行化计算。但是,您可以使用concurrent.futures来并发收集数据帧,其性能几乎与并行执行loop.Not parallalize in python而是spark中一样好。我可以使用sc.parallelize(),但不确定之后如何进行,我仍在试图弄清楚使用sc.parallelize()时会发生什么