Flink支持的Java数据类型
Java元组类型
Flink中java的元组类型是Flink自己定义的。
Tuple1,Tuple2,Tuple2.。。。。Tuple25以此类推
数据结构类似于(data1,data2,data3)是一个线性表
Java的包装类
Integer,Double等等
Java的简单对象(POJO)
简单类,必须有无参构造函数,属性是public,属性不是public,就必须有get,set函数。
其它
ArrayList,HashMap等等。
UDF(自定义函数)函数类
函数类
MapFunction,FilterFunction,ProcessFunction等等是在Map,Fliter,Process任务中。
使用lambda表达式需要注意是否有泛型擦除的问题。
富函数
很多操作都有富函数,在原有函数之上进行扩展:
很多UDF都是可以使用福函数的,其中富函数还包括open,close,上下文操作等等。
RichMapFunction具有MapFunction的功能,其中的map函数也是循环调用,并且增加了这个任务开始和结束时应该发生的事情,利用open和close函数,这两个函数只在开始和结束时执行一次
package org.benchmark;
import org.apache.flink.api.common.functions.RichMapFunction;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class TransFormRichFunction {
public static void main(String[] args) throws Exception{
// 创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
// 读取文件数据
String inputPath = Thread.currentThread().getContextClassLoader().getResource("sensor.txt").getFile();
DataStreamSource<String> stringDataStreamSource = env.readTextFile(inputPath);
// map操作
SingleOutputStreamOperator<SensorReading2> map = stringDataStreamSource.map((String value) -> {
String[] fields = value.split(",");
return new SensorReading2(fields[0], new Long(fields[1]), new Double(fields[2]));
}).setParallelism(2);
map.map(new RichMapFunction<SensorReading2, Object>() {
@Override
public Object map(SensorReading2 value) throws Exception {
// 返回任务序号
return new Tuple2<>(value.getId(), getRuntimeContext().getIndexOfThisSubtask());
}
@Override
public void open(Configuration parameters) throws Exception {
// 初始化工作,一般是定义状态,或者建立数据库连接
System.out.println(getRuntimeContext().getIndexOfThisSubtask() + "open");
}
@Override
public void close() throws Exception {
// 关闭连接,清空状态等收尾操作
System.out.println(getRuntimeContext().getIndexOfThisSubtask() + "close");
}
}).print();
// 启动Job
env.execute();
}
}