如何在PySpark中对big Spark数据帧中的每个行子集执行映射操作

如何在PySpark中对big Spark数据帧中的每个行子集执行映射操作,pyspark,spark-dataframe,rdd,pyspark-sql,Pyspark,Spark Dataframe,Rdd,Pyspark Sql,我正在使用PySpark,我想做的是: 大火花数据帧df包含所有记录。我想在这个df中,对记录的每个子集除以“id”列进行并行计算。我现在能想到的方法如下:(我将用一个简单的例子来说明) 然而,当我试着去做 df_agg.rdd.map(my_func) 其中“my_func”是一个主要进行Spark数据帧计算的函数,我遇到了一些问题,不知道如何继续。my_func对一行进行操作,其中一行['records']现在保存结构列表。如何将此结构列表转换回Spark数据帧 toDF()不起作用。我

我正在使用PySpark,我想做的是:

大火花数据帧df包含所有记录。我想在这个df中,对记录的每个子集除以“id”列进行并行计算。我现在能想到的方法如下:(我将用一个简单的例子来说明)

然而,当我试着去做

 df_agg.rdd.map(my_func)
其中“my_func”是一个主要进行Spark数据帧计算的函数,我遇到了一些问题,不知道如何继续。my_func对一行进行操作,其中一行['records']现在保存结构列表。如何将此结构列表转换回Spark数据帧

toDF()不起作用。我尝试了spark.createDataFrame(list,schema),在那里我甚至输入了原始DF使用的模式,但它仍然不起作用

我对这些Pypark操作比较陌生,如果您能让我知道处理此案件的正确方法,我将非常感谢您的帮助


谢谢

无法对您在尝试
df_agg.rdd.map(my_func)
时遇到的错误进行评论(如果您提供了
my_func
的示例,我可以试一试)。但是,您提到无法转换为数据帧,因此这里有一个解决方案:

from pyspark.sql.types import StringType, StructField, StructType, BooleanType, ArrayType, IntegerType

schema=StructType(
               [StructField("id", IntegerType(), True), \
                StructField("records", 
                    ArrayType(StructType([StructField("id", IntegerType(), True),\
                        StructField("name", StringType(), True),\
                        StructField("score", IntegerType(), True)])))
               ])

df_agg.rdd.toDF(schema=schema).show(2)

什么是我的功能?错误是什么?任何想要将上面“记录”中的“结构列表”转换回Spark数据帧并继续在此df上运行的函数。一个简单的例子就是编写
rdd_new=df_agg.rdd.map(lambda r:spark.createDataFrame(r.records))
,当我们执行rdd_new.collect()时,会出现以下错误:Py4JError:调用o25时出错。u getnewargs_uuuu。Trace:py4j.Py4JException:py4j.Gateway.invoke(Gateway.java:272)py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)py4j.ReflectionEngine.getMethod(ReflectionEngine.java:326)py4j.ReflectionEngine.ReflectionEngine.getMethod(ReflectionEngine.java:318)的py4j.reflectionNewArgs.ReflectionEngine在py4j.commands.CallCommand.execute(CallCommand.java:79)在py4j.GatewayConnection.run(GatewayConnection.java:214)在java.lang.Thread.run(Thread.java:745)请不要在注释中发布错误消息或长代码段-改为编辑和更新帖子!
from pyspark.sql.types import StringType, StructField, StructType, BooleanType, ArrayType, IntegerType

schema=StructType(
               [StructField("id", IntegerType(), True), \
                StructField("records", 
                    ArrayType(StructType([StructField("id", IntegerType(), True),\
                        StructField("name", StringType(), True),\
                        StructField("score", IntegerType(), True)])))
               ])

df_agg.rdd.toDF(schema=schema).show(2)