THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
This is achievable by the introduction of a recursive method, inferSchema(JsonNode jsonValue), which calls itself in order to handle complex data types and is equipped with the capability of building nested Schemas and providing coverage for all JSON documents:
Code Block | ||
---|---|---|
| ||
privateprivate Schema inferSchema(JsonNode jsonValue) { switch (jsonValue.getNodeType()) { case NULL: return Schema.OPTIONAL_STRING_SCHEMA; case BOOLEAN: return Schema.BOOLEAN_SCHEMA; case NUMBER: if (jsonValue.isIntegralNumber()) { return Schema.INT64_SCHEMA; } else { return Schema.FLOAT64_SCHEMA; } case ARRAY: SchemaBuilder arrayBuilder = SchemaBuilder.array(jsonValue.elements().hasNext() ? inferSchema(jsonValue.elements().next()) : Schema.OPTIONAL_STRING_SCHEMA); return arrayBuilder.build(); case OBJECT: SchemaBuilder structBuilder = SchemaBuilder.struct(); Iterator<Map.Entry<String, JsonNode>> it = jsonValue.fields(); while (it.hasNext()) { Map.Entry<String, JsonNode> entry = it.next(); structBuilder.field(entry.getKey(), inferSchema(entry.getValue())); } return structBuilder.build(); case STRING: return Schema.STRING_SCHEMA; case BINARY: case defaultMISSING: case POJO: return null;default: } return null; } } |
Compatibility, Deprecation, and Migration Plan
...