This is an automated email from the ASF dual-hosted git repository.

dongjoon pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/orc.git


The following commit(s) were added to refs/heads/main by this push:
     new d4f13dc28 ORC-1696: Fix ClassCastException when reading avro decimal 
type in bechmark
d4f13dc28 is described below

commit d4f13dc284fc12b7ff109493652473faec8724d3
Author: sychen <syc...@ctrip.com>
AuthorDate: Mon Apr 22 01:04:52 2024 -0700

    ORC-1696: Fix ClassCastException when reading avro decimal type in bechmark
    
    ### What changes were proposed in this pull request?
    This PR aims to fix `ClassCastException` when reading avro decimal type in 
bechmark.
    
    ### Why are the changes needed?
    ORC-1191 Forcing `object` to `double`, but object type is `ByteBuffer`, 
which causes scan to fail.
    
    ```bash
     java -jar core/target/orc-benchmarks-core-*-uber.jar scan data
    ```
    
    ```java
    Exception in thread "main" java.lang.ClassCastException: class 
java.nio.HeapByteBuffer cannot be cast to class java.lang.Double 
(java.nio.HeapByteBuffer and java.lang.Double are in module java.base of loader 
'bootstrap')
            at 
org.apache.orc.bench.core.convert.avro.AvroReader$DecimalConverter.convert(AvroReader.java:204)
            at 
org.apache.orc.bench.core.convert.avro.AvroReader.nextBatch(AvroReader.java:69)
            at 
org.apache.orc.bench.core.convert.ScanVariants.run(ScanVariants.java:92)
            at org.apache.orc.bench.core.Driver.main(Driver.java:64)
    ```
    
    ### How was this patch tested?
    local test
    ```bash
     java -jar core/target/orc-benchmarks-core-*-uber.jar scan data
    ```
    output
    ```
    data/generated/taxi/avro.snappy rows: 22758236 batches: 22225
    ```
    
    ### Was this patch authored or co-authored using generative AI tooling?
    No
    
    Closes #1898 from cxzl25/ORC-1696.
    
    Authored-by: sychen <syc...@ctrip.com>
    Signed-off-by: Dongjoon Hyun <dongj...@apache.org>
---
 .../org/apache/orc/bench/core/convert/avro/AvroReader.java | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git 
a/java/bench/core/src/java/org/apache/orc/bench/core/convert/avro/AvroReader.java
 
b/java/bench/core/src/java/org/apache/orc/bench/core/convert/avro/AvroReader.java
index 97b58a8fe..2756ca1dd 100644
--- 
a/java/bench/core/src/java/org/apache/orc/bench/core/convert/avro/AvroReader.java
+++ 
b/java/bench/core/src/java/org/apache/orc/bench/core/convert/avro/AvroReader.java
@@ -41,6 +41,7 @@ import org.apache.orc.TypeDescription;
 import org.apache.orc.bench.core.convert.BatchReader;
 
 import java.io.IOException;
+import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.util.List;
 
@@ -201,7 +202,11 @@ public class AvroReader implements BatchReader {
         cv.isNull[row] = true;
       } else {
         DecimalColumnVector tc = (DecimalColumnVector) cv;
-        tc.vector[row].set(HiveDecimal.create(Math.round((double) value * 
multiplier)));
+        if (value instanceof ByteBuffer) {
+          tc.vector[row].set(getHiveDecimalFromByteBuffer((ByteBuffer) value, 
scale));
+        } else {
+          tc.vector[row].set(HiveDecimal.create(Math.round((double) value * 
multiplier)));
+        }
       }
     }
   }
@@ -289,6 +294,13 @@ public class AvroReader implements BatchReader {
     }
   }
 
+  static HiveDecimal getHiveDecimalFromByteBuffer(ByteBuffer byteBuffer,
+                                                  int scale) {
+    byte[] result = getBytesFromByteBuffer(byteBuffer);
+    HiveDecimal dec = HiveDecimal.create(new BigInteger(result), scale);
+    return dec;
+  }
+
   static byte[] getBytesFromByteBuffer(ByteBuffer byteBuffer) {
     byteBuffer.rewind();
     byte[] result = new byte[byteBuffer.limit()];

Reply via email to