我有一个火花数据框,有一些数字列。 我想在这些列上进行几个聚合操作,为每个函数创建一个新列,其中一些也可能是用户定义的。
简单的解决方案是使用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]))
我怀疑效率。上述两个函数中的每一个都扫描整个数据库,而更智能的方法是使用一次扫描计算两个结果。
有关如何做到这一点的任何暗示?
由于
莫罗
答案 0 :(得分:1)
TL; DR 您正试图解决不存在的问题
SQL转换是惰性和声明性的。系列操作转换为逻辑执行计划,然后转换为物理执行计划。在第一阶段,Spark优化器可以自由地重新排序,组合甚至删除计划的任何部分。但是,您必须区分两种情况:
udf
。第一个需要单独转换为Python RDD。它不能与本机处理相结合。第二个是使用生成的代码本地处理的。
一旦您请求结果,物理计划将转换为阶段并执行。