spark broadcast side join实例

来源:互联网 发布:excel多列数据找相同 编辑:程序博客网 时间:2024/06/05 18:48

    

        在用spark进行大数据处理时,join是少不了的操作。由于join会导致shuffle,所以当数据量较大时,会导致效率很低,甚至任务失败。


        为了有效解决shuffle阶段引起的效率过低问题,我们可以使用broadcast map side join来避免shuffle阶段导致的效率变低问题。


       使用map side join时,我们可以把一个较小的dataframe转换成map并“广播”,从而避免shuffle操作。


        直接看实例。

                      

def cc_in_flow(cc_info_bc:    //被广播的变量,后边Map要对应               org.apache.spark.broadcast.Broadcast[scala.collection.Map[String,String]])={  udf((ip_server: String) =>    cc_info_bc.value.      getOrElse(ip_server,""))}val ccDF_info=cnc_df.rdd.map(p=>(p.getString(0),p.getString(1))).collectAsMap()val ccDF_info_bc=sc.broadcast(ccDF_info)
val joinDF_ALL = df_flow_m.where((cc_in_flow(ccDF_info_bc)(col("src_ip")) notEqual("")) or  (cc_in_flow(ccDF_info_bc)(col("dst_ip")) notEqual("")))
以上代码用来代替cnc_df与df_flow_m的join操作,执行时间可以从1小时降到5分钟!!

原创粉丝点击