如何在Spark中对同一行进行不同的总和

时间:2017-09-12 07:13:34

标签: apache-spark pyspark spark-dataframe

我有一个火花数据框,有一些数字列。 我想在这些列上进行几个聚合操作,为每个函数创建一个新列,其中一些也可能是用户定义的。

简单的解决方案是使用dataframe和withColumn。对于istance,如果我想计算平均值(手动)和字段field_1和field_2上的函数my_function,我会这样做:

df=df.withColumn("mean",(df["field_1"]+df["field_2])/2)
df=df.withColumn("foo", my_function(df["field_1"],df["field_2]))

我怀疑效率。上述两个函数中的每一个都扫描整个数据库,而更智能的方法是使用一次扫描计算两个结果。

有关如何做到这一点的任何暗示?

由于

莫罗

1 个答案:

答案 0 :(得分:1)

TL; DR 您正试图解决不存在的问题

SQL转换是惰性和声明性的。系列操作转换为逻辑执行计划,然后转换为物理执行计划。在第一阶段,Spark优化器可以自由地重新排序,组合甚至删除计划的任何部分。但是,您必须区分两种情况:

  • Python udf
  • SQL表达。

第一个需要单独转换为Python RDD。它不能与本机处理相结合。第二个是使用生成的代码本地处理的。

一旦您请求结果,物理计划将转换为阶段并执行。