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)