Scala中的Spark分组映射自定义项
我正在尝试编写一些代码,使我能够对数据帧的一组行计算一些操作。在PySpark中,这可以通过定义类型为GROUPED_MAP的UDF来实现。然而,在Scala中,我只找到了创建自定义聚合器(UDAFs)或经典UDF的方法 我的临时解决方案是生成一个密钥列表,对我的组进行编码,这将允许我过滤数据帧并对数据帧的每个子集执行操作。然而,这种方法不是最优的,而且速度很慢。 执行的操作是按顺序进行的,因此需要大量时间。我可以并行化这个循环,但我确信这会显示出任何改进,因为Spark已经被分发了 有没有更好的方法来做我想做的事Scala中的Spark分组映射自定义项,scala,dataframe,apache-spark,Scala,Dataframe,Apache Spark,我正在尝试编写一些代码,使我能够对数据帧的一组行计算一些操作。在PySpark中,这可以通过定义类型为GROUPED_MAP的UDF来实现。然而,在Scala中,我只找到了创建自定义聚合器(UDAFs)或经典UDF的方法 我的临时解决方案是生成一个密钥列表,对我的组进行编码,这将允许我过滤数据帧并对数据帧的每个子集执行操作。然而,这种方法不是最优的,而且速度很慢。 执行的操作是按顺序进行的,因此需要大量时间。我可以并行化这个循环,但我确信这会显示出任何改进,因为Spark已经被分发了 有没有更好
编辑:尝试使用Futures进行并行化,但没有任何速度提升,就我所知,这在Scala中是不可能的。根据需要,我认为还有其他方法可以将转换应用于Spark/Scala中的一组行:
groupBy(…).agg(collect_list())
,并使用对值数组进行操作的UDF。如果需要,可以将select语句与explode()
一起使用,以还原为原始格式import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy('group)
val result = spark.range(100)
.withColumn("group", pmod('id, lit(3)))
.withColumn("group_sum", sum('id).over(w))