You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by su...@apache.org on 2021/08/10 04:35:50 UTC
[hive] branch branch-3.1 updated: HIVE-24324: Remove deprecated API
usage from Avro (#1621) (#1711)
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 <su...@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);
}