在flink的job开发过程中,我们整体会经历三个阶段,分别是:source -> Transform -> sink。今天我们就来介绍下这个Transform,即数据转换。
一、flink如何执行转换操作
在flink的DataSet模型和DataStream模型里面,读取完毕数据源之后,就会开始执行转换操作。flink在转换过程中,通过不同的算子来实现的,每一个算子内部实现了对应函数的数据处理逻辑。常见的执行算子有:
Map算子 FlatMap算子 Filter算子 KeyBy算子 等等
我们在执行转换的过程中,定义每个算子处理什么样的逻辑,同时定义算子的执行顺序即可。用户也可以自定义一些算子函数的处理逻辑,在使用的时候,直接应用自定义的算子即可。
二、flink中如何进行分区
在flink的数据转换中,例如join,Group by等算子在执行数据转换的过程中,需要将相同键的数据路由到相同的管道中,再进行下一步的计算。这时候,我们就需要通过指定对应的键对数据进行分区。那么指定分区键有哪些方式呢?
1、根据字段位置进行指定
在DataStream的模型里面,我们可以通过keyBy()方法将数据集根据指定的键进行分区。在方法内部传入字段的位置即可,从第0个位置开始。在DataSet的模型里面,我们可以通过GroupBy()方法将数据集根据指定的键进行分区。在方法内部传入字段的位置即可,从第0个位置开始。示例如下:
StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<String> dataSource = environment.addSource(new MySources()); dataSource.keyBy(0);
上诉例子就代表的是通过第0个字段进行分区
2、根据字段名称指定
在DataStream的模型里面,我们可以通过keyBy()方法将数据集根据指定的键进行分区。在方法内部传入字段的名称即可。在DataSet的模型里面,我们可以通过GroupBy()方法将数据集根据指定的键进行分区。在方法内部传入字段的名称即可。示例如下:
StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<String> dataSource = environment.addSource(new MySources()); dataSource.keyBy("word");
3、通过键选择器进行指定
这个主要是自定义构造一个键选择器的类,然后在指定的时候传入这个键选择器的类即可。示例如下:
StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<String> dataSource = environment.addSource(new MySources()); dataSource.keyBy(new MyKeySelector()) public static class MyKeySelector implements KeySelector<MarketingUserBehavior,Tuple2<String,String>>{ @Override public Tuple2<String, String> getKey(MarketingUserBehavior marketingUserBehavior) throws Exception { return new Tuple2<>(marketingUserBehavior.getChannel(), marketingUserBehavior.getBehavior()); } }
还没有评论,来说两句吧...