in parquet-cli/src/main/java/org/apache/parquet/cli/json/AvroJson.java [219:259]
private static Schema resolveUnion(JsonNode datum, Collection<Schema> schemas) {
Set<Schema.Type> primitives = Sets.newHashSet();
List<Schema> others = Lists.newArrayList();
for (Schema schema : schemas) {
if (PRIMITIVES.containsKey(schema.getType())) {
primitives.add(schema.getType());
} else {
others.add(schema);
}
}
// Try to identify specific primitive types
Schema primitiveSchema = null;
if (datum == null || datum.isNull()) {
primitiveSchema = closestPrimitive(primitives, Schema.Type.NULL);
} else if (datum.isShort() || datum.isInt()) {
primitiveSchema = closestPrimitive(
primitives, Schema.Type.INT, Schema.Type.LONG, Schema.Type.FLOAT, Schema.Type.DOUBLE);
} else if (datum.isLong()) {
primitiveSchema = closestPrimitive(primitives, Schema.Type.LONG, Schema.Type.DOUBLE);
} else if (datum.isFloat()) {
primitiveSchema = closestPrimitive(primitives, Schema.Type.FLOAT, Schema.Type.DOUBLE);
} else if (datum.isDouble()) {
primitiveSchema = closestPrimitive(primitives, Schema.Type.DOUBLE);
} else if (datum.isBoolean()) {
primitiveSchema = closestPrimitive(primitives, Schema.Type.BOOLEAN);
}
if (primitiveSchema != null) {
return primitiveSchema;
}
// otherwise, select the first schema that matches the datum
for (Schema schema : others) {
if (matches(datum, schema)) {
return schema;
}
}
throw new RecordException(String.format("Cannot resolve union: %s not in %s", datum, schemas));
}