Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的Spark分组映射自定义项_Scala_Dataframe_Apache Spark - Fatal编程技术网

Scala中的Spark分组映射自定义项

Scala中的Spark分组映射自定义项,scala,dataframe,apache-spark,Scala,Dataframe,Apache Spark,我正在尝试编写一些代码,使我能够对数据帧的一组行计算一些操作。在PySpark中,这可以通过定义类型为GROUPED_MAP的UDF来实现。然而,在Scala中,我只找到了创建自定义聚合器(UDAFs)或经典UDF的方法 我的临时解决方案是生成一个密钥列表,对我的组进行编码,这将允许我过滤数据帧并对数据帧的每个子集执行操作。然而,这种方法不是最优的,而且速度很慢。 执行的操作是按顺序进行的,因此需要大量时间。我可以并行化这个循环,但我确信这会显示出任何改进,因为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))