This is an automated email from the ASF dual-hosted git repository. sunchao pushed a commit to branch branch-3.1 in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/branch-3.1 by this push: new a2d82a7 HIVE-24324: Remove deprecated API usage from Avro (#1621) (#1711) a2d82a7 is described below commit a2d82a7244fd4037ed463db2532f64206f9abb71 Author: Chao Sun <sunc...@apple.com> AuthorDate: Mon Aug 9 21:34:27 2021 -0700 HIVE-24324: Remove deprecated API usage from Avro (#1621) (#1711) --- .../apache/hadoop/hive/serde2/avro/AvroDeserializer.java | 6 +++--- .../org/apache/hadoop/hive/serde2/avro/AvroSerdeUtils.java | 12 ++++++++++++ .../apache/hadoop/hive/serde2/avro/SchemaToTypeInfo.java | 14 ++++++++++---- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java b/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java index db8db1c..e8d122e 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java @@ -272,7 +272,7 @@ class AvroDeserializer { int scale = 0; try { - scale = fileSchema.getJsonProp(AvroSerDe.AVRO_PROP_SCALE).asInt(); + scale = AvroSerdeUtils.getIntFromSchema(fileSchema, AvroSerDe.AVRO_PROP_SCALE); } catch(Exception ex) { throw new AvroSerdeException("Failed to obtain scale value from file schema: " + fileSchema, ex); } @@ -288,7 +288,7 @@ class AvroDeserializer { int maxLength = 0; try { - maxLength = fileSchema.getJsonProp(AvroSerDe.AVRO_PROP_MAX_LENGTH).getValueAsInt(); + maxLength = AvroSerdeUtils.getIntFromSchema(fileSchema, AvroSerDe.AVRO_PROP_MAX_LENGTH); } catch (Exception ex) { throw new AvroSerdeException("Failed to obtain maxLength value for char field from file schema: " + fileSchema, ex); } @@ -303,7 +303,7 @@ class AvroDeserializer { maxLength = 0; try { - maxLength = fileSchema.getJsonProp(AvroSerDe.AVRO_PROP_MAX_LENGTH).getValueAsInt(); + maxLength = AvroSerdeUtils.getIntFromSchema(fileSchema, AvroSerDe.AVRO_PROP_MAX_LENGTH); } catch (Exception ex) { throw new AvroSerdeException("Failed to obtain maxLength value for varchar field from file schema: " + fileSchema, ex); } diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerdeUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerdeUtils.java index d16abdb..3b96d30 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerdeUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerdeUtils.java @@ -322,6 +322,18 @@ public class AvroSerdeUtils { } } + public static int getIntFromSchema(Schema schema, String name) { + Object obj = schema.getObjectProp(name); + if (obj instanceof String) { + return Integer.parseInt((String) obj); + } else if (obj instanceof Integer) { + return (int) obj; + } else { + throw new IllegalArgumentException("Expect integer or string value from property " + name + + " but found type " + obj.getClass().getName()); + } + } + /** * Called on specific alter table events, removes schema url and schema literal from given tblproperties * After the change, HMS solely will be responsible for handling the schema diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/avro/SchemaToTypeInfo.java b/serde/src/java/org/apache/hadoop/hive/serde2/avro/SchemaToTypeInfo.java index 35d83bd..5557a6a 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/avro/SchemaToTypeInfo.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/avro/SchemaToTypeInfo.java @@ -136,8 +136,14 @@ class SchemaToTypeInfo { int precision = 0; int scale = 0; try { - precision = schema.getJsonProp(AvroSerDe.AVRO_PROP_PRECISION).getIntValue(); - scale = schema.getJsonProp(AvroSerDe.AVRO_PROP_SCALE).getIntValue(); + Object o = schema.getObjectProp(AvroSerDe.AVRO_PROP_PRECISION); + if (o instanceof Integer) { + precision = (int) o; + } + o = schema.getObjectProp(AvroSerDe.AVRO_PROP_SCALE); + if (o instanceof Integer) { + scale = (int) o; + } } catch (Exception ex) { throw new AvroSerdeException("Failed to obtain scale value from file schema: " + schema, ex); } @@ -155,7 +161,7 @@ class SchemaToTypeInfo { AvroSerDe.CHAR_TYPE_NAME.equalsIgnoreCase(schema.getProp(AvroSerDe.AVRO_PROP_LOGICAL_TYPE))) { int maxLength = 0; try { - maxLength = schema.getJsonProp(AvroSerDe.AVRO_PROP_MAX_LENGTH).getValueAsInt(); + maxLength = AvroSerdeUtils.getIntFromSchema(schema, AvroSerDe.AVRO_PROP_MAX_LENGTH); } catch (Exception ex) { throw new AvroSerdeException("Failed to obtain maxLength value from file schema: " + schema, ex); } @@ -166,7 +172,7 @@ class SchemaToTypeInfo { .equalsIgnoreCase(schema.getProp(AvroSerDe.AVRO_PROP_LOGICAL_TYPE))) { int maxLength = 0; try { - maxLength = schema.getJsonProp(AvroSerDe.AVRO_PROP_MAX_LENGTH).getValueAsInt(); + maxLength = AvroSerdeUtils.getIntFromSchema(schema, AvroSerDe.AVRO_PROP_MAX_LENGTH); } catch (Exception ex) { throw new AvroSerdeException("Failed to obtain maxLength value from file schema: " + schema, ex); }