map是大家非常熟悉的大数据操作算子,主要用于将数据流中的数据进行转换,形成新的数据流。简单来说,就是一个"一一映射",消费一个元素就产出一个元素。
我们只需要基于DataStream调用map()方法就可以进行转换处理。方法需要传入的参数是接口MapFunction的实现;返回值类型还是DataStream,不过泛型(流中的元素类型)可能改变。
下面的代码,实现了提取WaterSensor中的id字段的功能。
java
import com.atguigu.bean.WaterSensor;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSink;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class Mapdeam {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
DataStreamSource<WaterSensor> senseDS = env.fromElements(new WaterSensor("s1", 1l, 1)
, new WaterSensor("s1", 2l, 2),
new WaterSensor("s1", 3l, 3)
);
SingleOutputStreamOperator<String> map = senseDS.map(sense -> sense.getId());
map.print();
env.execute();
}
}
map是一个一对一的算子,也就是说输入一个数据那经过map算子之后也只会输出一个数据
根据代码中
java
SingleOutputStreamOperator<String> map = senseDS.map(sense -> sense.getId());
可知 是将senseDS的数据经过(sense -> sense.getid())的表达式进行的输出
也可以使用匿名类的方法实现如下:
java
senseDS.map(new MapFunction<WaterSensor, String>() {
@Override
public String map(WaterSensor waterSensor) throws Exception {
return waterSensor.getId();
}
}).print();
但是通过直观感受使用第一个方法代码比较简洁
请各位自行选择
谢谢