Flink DataSet获取变量的4种方式

1. 通过广播变量获取


import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;
import java.util.ArrayList;
import java.util.List;

public class parameter {
    public static void main(String[] args) throws Exception {
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<Integer> boardcast = env.fromElements(1,2,3);

        DataSet<Integer> ds = env.fromElements(2);

        DataSet<Integer> DS = ds.flatMap(new RichFlatMapFunction<Integer, Integer>() {
            List<Integer> list = new ArrayList<Integer>();

            @Override
            public void flatMap(Integer s, Collector<Integer> collector) throws Exception {
                for(Integer ss : list){
                    collector.collect(ss * s);
                }
            }

            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                list = getRuntimeContext().getBroadcastVariable("boardcast");
            }

        }).withBroadcastSet(boardcast,"boardcast");

        DS.print();
    }
}

2. 通过withParameters传递参数


import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;
import java.util.ArrayList;
import java.util.List;

public class parameter {
    public static void main(String[] args) throws Exception {
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<Integer> boardcast = env.fromElements(1,2,3);
        //设置config,并添加变量
        Configuration config = new Configuration();
        config.setInteger("limit", 2);

        DataSet<Integer> ds = env.fromElements(2);
        DataSet<Integer> DS = ds.flatMap(new RichFlatMapFunction<Integer, Integer>() {
            private int limit;

            @Override
            public void flatMap(Integer s, Collector<Integer> collector) throws Exception {

                collector.collect(limit * s);

            }

            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                //获取变量
               limit = parameters.getInteger("limit",0);
            }

        }).withParameters(config);

        DS.print();
    }
}

3. 通过构造函数传递参数

DataSet<Integer> toFilter = env.fromElements(1, 2, 3);

toFilter.filter(new MyFilter(2));

private static class MyFilter implements FilterFunction<Integer> {

  private final int limit;

  public MyFilter(int limit) {
    this.limit = limit;
  }

  @Override
  public boolean filter(Integer value) throws Exception {
    return value > limit;
  }
}

4. 全局参数传递, 这种方式和withParameters感觉差不多

//先全局设置参数
Configuration conf = new Configuration();
conf.setString("mykey","myvalue");
final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.getConfig().setGlobalJobParameters(conf);

//再全局获取参数
public static final class Tokenizer extends RichFlatMapFunction<String, Tuple2<String, Integer>> {

    private String mykey;
    @Override
    public void open(Configuration parameters) throws Exception {
      super.open(parameters);
      ExecutionConfig.GlobalJobParameters globalParams = getRuntimeContext().getExecutionConfig().getGlobalJobParameters();
      Configuration globConf = (Configuration) globalParams;
      mykey = globConf.getString("mykey", null);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tom_fans

谢谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值