更新时间:2025-12-10 GMT+08:00
分享

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

相关文档