上篇:connect的使用
project [DataStream → DataStream]
project 主要用于获取 tuples 中的指定字段集
public static void project(StreamExecutionEnvironment env) {
DataStreamSource<Tuple3<String, Integer, String>> streamSource = env.fromElements(
new Tuple3<>("li", 22, "2018-09-23"),
new Tuple3<>("ming", 33, "2020-09-23"));
streamSource.project(0, 2).print();
}
运行结果:
(ming,2020-09-23)
(li,2018-09-23)
来一个实例,直接上代码:
package cn._51doit.flink.day03;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
/**
* project的使用
* 有界流
*
* 直接运行,控制台打印输出:
* 2> (99.99,laoduan)
* 1> (9999.99,laozhao)
*/
public class ProjectDemo {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
DataStreamSource<String> lines = env.fromElements("laozhao,18,9999.99","laoduan,28,99.99");
SingleOutputStreamOperator<Tuple3<String, Integer, Double>> tpDataStream = lines.map(e -> {
String[] fields = e.split(",");
return Tuple3.of(fields[0], Integer.parseInt(fields[1]), Double.parseDouble(fields[2]));
}).returns(Types.TUPLE(Types.STRING,Types.INT,Types.DOUBLE));
SingleOutputStreamOperator<Tuple> projected = tpDataStream.project(2, 0);
projected.print();
env.execute();
}
}
代码改造后:
package cn._51doit.flink.day03;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
/**
* project的使用:有界流
*
* 直接运行,控制台打印输出[代码改造之前]
* 4> (99.99,laoduan)
* 3> (9999.99,laozhao)
*
* 直接运行,控制台打印输出[代码改造之后]
* 3> (9999.99,laozhao)
* 4> (99.99,laoduan)
*/
public class ProjectDemo_01 {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
DataStreamSource<String> lines = env.fromElements("laozhao,18,9999.99","laoduan,28,99.99");
SingleOutputStreamOperator<Tuple3<String, Integer, Double>> tpDataStream = lines.map(e -> {
String[] fields = e.split(",");
return Tuple3.of(fields[0], Integer.parseInt(fields[1]), Double.parseDouble(fields[2]));
}).returns(Types.TUPLE(Types.STRING,Types.INT,Types.DOUBLE));
SingleOutputStreamOperator<Tuple2<Double, String>> projected = tpDataStream.map(new MapFunction<Tuple3<String, Integer, Double>, Tuple2<Double, String>>() {
@Override
public Tuple2<Double, String> map(Tuple3<String, Integer, Double> value) throws Exception {
return Tuple2.of(value.f2, value.f0);
}
});
projected.print();
env.execute();
}
}