这个是一个批处理的小demo,数据源是mysql
连接代码:
JDBCInputFormat productStoreChangeRecordFormat = JDBCInputFormat.buildJDBCInputFormat()
.setDrivername("")
.setDBUrl("")
.setUsername("")
.setPassword("")
.setQuery("sql")
.setRowTypeInfo(new RowTypeInfo(
Types.STRING(),
Types.SQL_TIMESTAMP(),
Types.INT()))
.finish();
URL需要注意:查询时会报异常The driver has not received any packets from the server.加上下面的就可以了
jdbc:mysql://?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
自定义UDF:
public class DateTransFunction extends ScalarFunction {
private static final long serialVersionUID = 6987170485362792532L;
private String pattern;
public DateTransFunction(String pattern) {
this.pattern = pattern;
}
public String eval(Timestamp date) {
return DateUtilss.transDateToString(date, pattern);
}
}
基础的类需要注意:是ScalarFunction
查询逻辑:
batchTableEnvironment.registerFunction("dateHour", new DateTransFunction(DateUtilss.YYYY_MM_DD_HH));
batchTableEnvironment.registerDataSet("productstorechangerecord", BATCH_ENV.createInput(productStoreChangeRecordFormat),
"ProductStoreId,createTime,TotalCount");
Table table = batchTableEnvironment.
sqlQuery("select dateHour(createTime) as createTimeHour from productstorechangerecord");
Table table1 = table.select("CAST(createTimeHour , String) as createTimeHour");
batchTableEnvironment.toDataSet(table1, Test.class).print();
需要注意的问题是在sqlQuery里面写sql和在select里写sql是不一样的,例如:cast()函数在SQLQuery里面是 as 在select中是 , 而且在SQLQuery中使用CAST()好像有点问题。select CAST(dateHour(createTime) as String) as createTimeHour 这种写法会报错,这里记录一下sql的写法和自定义。
努力吧,皮卡丘。