Flink 自定义udf 一 时间转换类

这个是一个批处理的小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的写法和自定义。

努力吧,皮卡丘。

 

你可能感兴趣的:(Flink)