Apache spark 如何从mapPartitions迭代器创建数据帧?

Apache spark 如何从mapPartitions迭代器创建数据帧?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个带有id列的数据帧。我想对每个id的行进行一些计算,而不仅仅是聚合,并输出一个新的数据帧,每个id一行,包含计算结果 我试图通过在id上重新分区,然后使用mapPartitions来实现这一点: 但是如何从iter中创建数据帧呢?目标是在包含id的所有行的数据帧dfSubset上进行计算 编辑: repartitioncolid不会为每个id创建一个分区。我们应该改用groupByid。您需要的是在id上创建一个groupBy,然后定义自己的分区。如果您需要所有列,您可以构造所述列的结构

我有一个带有id列的数据帧。我想对每个id的行进行一些计算,而不仅仅是聚合,并输出一个新的数据帧,每个id一行,包含计算结果

我试图通过在id上重新分区,然后使用mapPartitions来实现这一点:

但是如何从iter中创建数据帧呢?目标是在包含id的所有行的数据帧dfSubset上进行计算

编辑:


repartitioncolid不会为每个id创建一个分区。我们应该改用groupByid。

您需要的是在id上创建一个groupBy,然后定义自己的分区。如果您需要所有列,您可以构造所述列的结构并传递给聚合函数

df
.groupBy("id")
.agg(myUdaf(struct(df.columns.filter(_ != "id").map(col(_)):_*)).as("result")).show()

具体要求是什么。如果需要数据帧数组,可以选择randomsplit@victordeplasserepartitionpartitionExprs:Column*创建的分区不会像id的不同数量那样多,它只会创建spark.sql.shuffle.partitionsdefault 200分区,id的值将被散列以执行分区。我们可以避免重新划分。并添加每个id的处理代码作为mapPartitions逻辑的一部分?@DaRkMaN谢谢。我认为重新分区会为每个id创建一个分区。在这种情况下,最好使用groupByid。
df
.groupBy("id")
.agg(myUdaf(struct(df.columns.filter(_ != "id").map(col(_)):_*)).as("result")).show()