Flink 内置的函数是有限的,有时是需要通过 用户自定义函数来拓展这些函数。 假如 floor
函数不是系统预设函数,也可以自己实现。
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import org.apache.flink.table.annotation.DataTypeHint;
import org.apache.flink.table.functions.ScalarFunction;
public class MyFloor extends ScalarFunction {
public @DataTypeHint("TIMESTAMP(3)") LocalDateTime eval(
@DataTypeHint("TIMESTAMP(3)") LocalDateTime timestamp) {
return timestamp.truncatedTo(ChronoUnit.HOURS);
}
}
然后就可以在你的应用中使用了。
public static Table report(Table transactions) {
return transactions.select(
$("account_id"),
call(MyFloor.class, $("transaction_time")).as("log_ts"),
$("amount"))
.groupBy($("account_id"), $("log_ts"))
.select(
$("account_id"),
$("log_ts"),
$("amount").sum().as("amount"));
}
这条查询会从表 transactions
消费所有的记录,然后计算报表所需内容,最后将结果以高效、可拓展的方式输出。 按此逻辑实现,可以通过测试。