Flink Decimal计算精度增强
使用场景
当需要Decimal计算结果更加准确,精度需要扩大时可以使用该特性。
约束与限制
使用该特性时需要在Flink进程中添加参数:-Ddecimal.nonstandard=true
本章节仅适用于MRS 3.6.0-LTS及之后版本。
使用方法
配置Flink作业时,可通过在FlinkServer WebUI的Flink作业开发界面添加自定义参数“env.java.default-opts.all”为“-Ddecimal.nonstandard=true”开启,可参考创建FlinkServer作业。
public class DataStreamJob {
public static void main(String[] args) throws Exception {
// create environments of both APIs
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
// create a DataStream
DataStream<BigDecimal> dataStream = env.fromElements(new BigDecimal("1.1234"));
// interpret the insert-only DataStream as a Table
Table inputTable = tableEnv.fromDataStream(dataStream,Schema.newBuilder().column("f0", DataTypes.DECIMAL(18,10)).build());
//Table inputTable = tableEnv.fromDataStream(dataStream);
System.out.println(inputTable.getResolvedSchema());
// register the Table object as a view and query it
tableEnv.createTemporaryView("InputTable", inputTable);
Table resultTable = tableEnv.sqlQuery("SELECT f0*f0 FROM InputTable");
// interpret the insert-only Table as a DataStream again
DataStream<Row> resultStream = tableEnv.toDataStream(resultTable);
// add a printing sink and execute in DataStream API
resultStream.print();
env.execute();
}
}
- 开启该特性的计算结果:
1.2620275600000
- 不开启该特性的计算结果:
1.262028