什么是广播变量?为什么要引入这个东西?
就是一个公共变量,作用范围比全局变量要大!
引入这个的目的,节省内存资源。
看一个 demo
实现的步骤
1、创建数据集,并创建为广播变量
2、重写map方法,获取广播变量,然后数据转换一下得到想要的数据
package day04;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.operators.MapOperator;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import java.util.ArrayList;
public class test {
/**
* date 2023-03-28
*
* arm: 广播变量的用法
*/
public static void main(String[] args) {
ArrayList<Tuple2<Integer,String>> list = new ArrayList<>();
list.add(new Tuple2<>(1,"张三"));
list.add(new Tuple2<>(2,"李四"));
list.add(new Tuple2<>(3,"王五"));
ArrayList<Tuple3<Integer,String,Integer>> list1 = new ArrayList<>();
list1.add(new Tuple3<>(1, "语文", 50));
list1.add(new Tuple3<>(2, "数学", 70));
list1.add(new Tuple3<>(3, "英文", 86));
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSource<Tuple2<Integer, String>> student = env.fromCollection(list);
DataSource<Tuple3<Integer,String,Integer>> score = env.fromCollection(list1);
MapOperator<Tuple3<Integer, String, Integer>, Tuple3<String, String, Integer>> result = score.map(new mapFunction()).withBroadcastSet(student, "student");
try {
result.print();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package day04;
import org.apache.flink.api.common.functions.RichMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.configuration.Configuration;
import java.util.HashMap;
import java.util.List;
public class mapFunction extends RichMapFunction<Tuple3<Integer,String,Integer>,Tuple3<String,String,Integer> > {
static HashMap<Integer, String> map =new HashMap<Integer, String>();
@Override
public void open(Configuration parameters) throws Exception {
//获取广播变量
List<Tuple2<Integer, String>> lists = getRuntimeContext().getBroadcastVariable("student");
for(int i=0;i<lists.size();i++){
System.out.println(lists.get(i).f0+"--->"+lists.get(i).f1);
map.put(lists.get(i).f0,lists.get(i).f1);
}
}
@Override
public void close() throws Exception {
super.close();
}
@Override
public Tuple3<String, String, Integer> map(Tuple3<Integer, String, Integer> tups) throws Exception {
return new Tuple3(map.get(tups.f0),tups.f1,tups.f2);
}
}