package cn.edu.tju.demo3;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.*;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.*;
import org.apache.flink.table.functions.ScalarFunction;
import org.apache.flink.types.Row;
public class Test47 {
private static String HOST_NAME = "xx.xx.xx.xx";
private static int PORT = 9999;
private static String DELIMITER ="\n";
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
DataStream<String> socketDataInfo = env.socketTextStream(HOST_NAME, PORT, DELIMITER);
SingleOutputStreamOperator<DataInfo> dataInfoStream = socketDataInfo.map(new MapFunction<String, DataInfo>() {
@Override
public DataInfo map(String value) throws Exception {
String[] stringList = value.split(",");
DataInfo dataInfo = new DataInfo(Long.parseLong(
stringList[0]), stringList[1], Double.parseDouble(stringList[2]));
return dataInfo;
}
});
Table dataTable = tableEnv.fromDataStream(dataInfoStream,"ts,info,val");
tableEnv.registerFunction("myScalarFunction", new MyScalarFunction());
Table resultTable = dataTable.select("ts,info,myScalarFunction(val)");
tableEnv.toAppendStream(resultTable, Row.class).print();
env.execute("my job");
}
public static class DataInfo{
private long ts;
private String info;
private double val;
public long getTs() {
return ts;
}
public void setTs(long ts) {
this.ts = ts;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public double getVal() {
return val;
}
public void setVal(double val) {
this.val = val;
}
@Override
public String toString() {
return "DataInfo{" +
"ts=" + ts +
", info='" + info + '\'' +
", val='" + val + '\'' +
'}';
}
public DataInfo(long ts, String info, double val) {
this.ts = ts;
this.info = info;
this.val = val;
}
public DataInfo() {
}
}
//自定义函数,必须定义一个public的 名字为eval方法
public static class MyScalarFunction extends ScalarFunction {
public double eval(double d){
return Math.floor(d);
}
}
}
nc -lk 9999
输入:
1689999832,ff,34.9
或者:
package cn.edu.tju.demo3;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.*;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.*;
import org.apache.flink.table.functions.ScalarFunction;
import org.apache.flink.types.Row;
public class Test48 {
private static String HOST_NAME = "xx.xx.xx.xx";
private static int PORT = 9999;
private static String DELIMITER ="\n";
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
DataStream<String> socketDataInfo = env.socketTextStream(HOST_NAME, PORT, DELIMITER);
SingleOutputStreamOperator<DataInfo> dataInfoStream = socketDataInfo.map(new MapFunction<String, DataInfo>() {
@Override
public DataInfo map(String value) throws Exception {
String[] stringList = value.split(",");
DataInfo dataInfo = new DataInfo(Long.parseLong(
stringList[0]), stringList[1], Double.parseDouble(stringList[2]));
return dataInfo;
}
});
Table dataTable = tableEnv.fromDataStream(dataInfoStream,"ts,info,val");
tableEnv.registerFunction("myScalarFunction", new MyScalarFunction());
tableEnv.createTemporaryView("dataInfo", dataTable);
Table resultTable = tableEnv.sqlQuery("select ts,info,myScalarFunction(val) from dataInfo");
tableEnv.toAppendStream(resultTable, Row.class).print();
env.execute("my job");
}
public static class DataInfo{
private long ts;
private String info;
private double val;
public long getTs() {
return ts;
}
public void setTs(long ts) {
this.ts = ts;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public double getVal() {
return val;
}
public void setVal(double val) {
this.val = val;
}
@Override
public String toString() {
return "DataInfo{" +
"ts=" + ts +
", info='" + info + '\'' +
", val='" + val + '\'' +
'}';
}
public DataInfo(long ts, String info, double val) {
this.ts = ts;
this.info = info;
this.val = val;
}
public DataInfo() {
}
}
//自定义函数,必须定义一个public的 名字为eval方法
public static class MyScalarFunction extends ScalarFunction {
public double eval(double d){
return Math.floor(d);
}
}
}