Flink的map操作是一种无状态转换操作,用于对输入的每个元素进行一对一的转换。
Flink的map操作主要涉及到MapFunction
接口的使用,该接口允许开发者定义一个函数,该函数对输入的每个元素执行一对一的转换操作。这意味着,对于输入流中的每个元素,map操作都会生成一个输出元素,这两个元素之间存在一一对应的关系。这种操作非常适合于那些需要对数据进行简单转换的场景,例如,将年龄减去1的操作就可以通过map操作来实现。
在Flink中,map操作可以通过Lambda表达式来实现,使得代码更加简洁和易读。例如,可以通过调用字符串的length
方法来计算字符串的长度,或者通过定义一个简单的函数来将年龄减去1。这种操作的灵活性使得它能够适应各种数据处理需求,无论是简单的数据转换还是复杂的业务逻辑处理。
总的来说,Flink的map操作是一种基础且强大的数据处理工具,它通过提供无状态转换的能力,使得开发者能够轻松地对数据进行转换和处理,无论是简单的数据清洗还是复杂的业务逻辑实现,都能够通过map操作高效地完成
实例:以下代码输出字符串的长度
package flink.transform.map;
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class Test1 {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置运行模式
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
// 2.加载数据源
DataStreamSource<String> elementsSource = env.fromElements("java",
"helloworld");
// 3.数据转换
DataStream<Integer> map = elementsSource.map(new MapFunction<String, Integer>() {
@Override
public Integer map(String s) throws Exception {
return s.length();
}
});
// 4.数据输出
map.print();
// 5.执行程序
env.execute("flink-hello-world");
}
}
例子2:实现格式化输出
/**
* 数据
* tom,man,12
* lilei,woman,20
* 要求如果最后一个逗号后面的数字小于18打印tom男未成年,大于18打印lilei女性成年
*
*/
public class Test2 {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置运行模式
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
// 2.加载数据源
DataStreamSource<String> elementsSource = env.fromElements("tom,man,12",
"lilei,woman,20");
// 3.数据转换
DataStream<String> map = elementsSource.map(new MapFunction<String, String>() {
@Override
public String map(String s) throws Exception {
String[] array = s.split(",");
String info = "";
String sex="";
String ageS ="";
if(Integer.parseInt(array[2])>18){
ageS="成年";
}else{
ageS="未成年";
}
if(array[1].equals("man")){
sex="男性";
}else{
sex="女性";
}
info=array[0]+sex+ageS;
return info;
}
});
// 4.数据输出
map.print();
// 5.执行程序
env.execute("flink-hello-world");
}
}