在用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分钟!!