silence created FLINK-23269: ------------------------------- Summary: json format decode number to vatchar error when define Decimal type in ddl Key: FLINK-23269 URL: https://issues.apache.org/jira/browse/FLINK-23269 Project: Flink Issue Type: Bug Components: Formats (JSON, Avro, Parquet, ORC, SequenceFile) Reporter: silence
when use json format and define decimal json: {"c1":50.0,"c2":50.0} ddl: create table( c1 varchar, c2 decimal )with( 'format'='json' ) output: {"c1":"5E+1","c2":50.0} And the following unit tests will produce the following results {"double1":50.0,"double2":50.0,"double3":"50.0","float1":20.0,"float2":20.0,"float3":"20.0"} java.lang.AssertionError: Expected :+I[50.0, 50.0, 50.0, 20.0, 20.0, 20.0] Actual :+I[5E+1, 50.0, 50.0, 2E+1, 20.0, 20.0] {code:java} @Test public void testDeserialization() throws Exception { double doubleValue = 50.0; float floatValue = 20.0f; ObjectMapper objectMapper = new ObjectMapper(); ObjectNode root = objectMapper.createObjectNode(); root.put("double1", doubleValue); root.put("double2", doubleValue); root.put("double3", String.valueOf(doubleValue)); root.put("float1", floatValue); root.put("float2", floatValue); root.put("float3", String.valueOf(floatValue)); byte[] serializedJson = objectMapper.writeValueAsBytes(root); System.out.println(new String(serializedJson)); DataType dataType = ROW( FIELD("double1", STRING()), FIELD("double2", DECIMAL(10,1)), FIELD("double3", DOUBLE()), FIELD("float1", STRING()), FIELD("float2", DECIMAL(10,1)), FIELD("float3", FLOAT())); RowType rowType = (RowType) dataType.getLogicalType(); JsonRowDataDeserializationSchema deserializationSchema = new JsonRowDataDeserializationSchema( rowType, InternalTypeInfo.of(rowType), false, false, TimestampFormat.ISO_8601); Row expected = new Row(6); expected.setField(0, String.valueOf(doubleValue)); expected.setField(1, String.valueOf(doubleValue)); expected.setField(2, doubleValue); expected.setField(3, String.valueOf(floatValue)); expected.setField(4, String.valueOf(floatValue)); expected.setField(5, floatValue); RowData rowData = deserializationSchema.deserialize(serializedJson); Row actual = convertToExternal(rowData, dataType); assertEquals(expected, actual); } {code} when define the DecimalType ObjectMapper will enable USE_BIG_DECIMAL_FOR_FLOATS and jsonNode.asText() will call BigDecimal toString method {code:java} boolean hasDecimalType = LogicalTypeChecks.hasNested(rowType, t -> t instanceof DecimalType); if (hasDecimalType) { objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); } {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)