You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kyuubi.apache.org by ch...@apache.org on 2026/10/13 03:02:39 UTC

(kyuubi) 02/05: Fix Spark 4.3 CI failures

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

pan3793 pushed a commit to branch spark-4.3
in repository https://gitbox.apache.org/repos/asf/kyuubi.git

commit 0f64c63a0f508ece19db85e29320016859dde7b6
Author: Cheng Pan <ch...@apache.org>
AuthorDate: Mon Aug 31 23:49:46 2026 +0800

    Fix Spark 4.3 CI failures
    
    Assisted-by: Codex
---
 .../execution/arrow/KyuubiArrowConverters.scala    | 38 ++++++++++++++++++++--
 .../hive/beeline/common/log/InPlaceUpdate.java     |  4 +--
 2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/spark/sql/execution/arrow/KyuubiArrowConverters.scala b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/spark/sql/execution/arrow/KyuubiArrowConverters.scala
index 9f690357b8..6a7e34bbd5 100644
--- a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/spark/sql/execution/arrow/KyuubiArrowConverters.scala
+++ b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/spark/sql/execution/arrow/KyuubiArrowConverters.scala
@@ -27,6 +27,7 @@ import org.apache.arrow.vector._
 import org.apache.arrow.vector.compression.NoCompressionCodec
 import org.apache.arrow.vector.ipc.{ArrowStreamWriter, ReadChannel, WriteChannel}
 import org.apache.arrow.vector.ipc.message.{IpcOption, MessageSerializer}
+import org.apache.arrow.vector.types.pojo.Schema
 import org.apache.spark.TaskContext
 import org.apache.spark.internal.Logging
 import org.apache.spark.sql.catalyst.{InternalRow, SQLConfHelper}
@@ -36,6 +37,8 @@ import org.apache.spark.sql.types._
 import org.apache.spark.sql.util.ArrowUtils
 import org.apache.spark.util.Utils
 
+import org.apache.kyuubi.util.reflect.DynMethods
+
 object KyuubiArrowConverters extends SQLConfHelper with Logging {
 
   type Batch = (Array[Byte], Long)
@@ -45,6 +48,37 @@ object KyuubiArrowConverters extends SQLConfHelper with Logging {
   private val ZstdCompressionCodecClassName =
     "org.apache.arrow.compression.ZstdCompressionCodec"
 
+  private lazy val toArrowSchemaMethod: DynMethods.BoundMethod =
+    DynMethods.builder("toArrowSchema")
+      .impl( // SPARK-58005 (4.3.0): added losslessInternalTypes to toArrowSchema
+        ArrowUtils.getClass,
+        classOf[StructType],
+        classOf[String],
+        java.lang.Boolean.TYPE,
+        java.lang.Boolean.TYPE,
+        java.lang.Boolean.TYPE)
+      .impl( // Spark < 4.3.0
+        ArrowUtils.getClass,
+        classOf[StructType],
+        classOf[String],
+        java.lang.Boolean.TYPE,
+        java.lang.Boolean.TYPE)
+      .build()
+      .bind(ArrowUtils)
+
+  private def toArrowSchema(
+      schema: StructType,
+      timeZoneId: String,
+      errorOnDuplicatedFieldNames: Boolean,
+      largeVarTypes: Boolean): Schema = {
+    toArrowSchemaMethod.invoke[Schema](
+      schema,
+      timeZoneId,
+      errorOnDuplicatedFieldNames,
+      largeVarTypes,
+      false)
+  }
+
   // Mirror Spark's SparkSession#enableHiveSupport: check the capability on each request instead
   // of caching, because the codec is a session-level config that can change at runtime.
   private def arrowCompressionAvailable: Boolean = {
@@ -87,7 +121,7 @@ object KyuubiArrowConverters extends SQLConfHelper with Logging {
       "slice",
       0,
       Long.MaxValue)
-    val arrowSchema = ArrowUtils.toArrowSchema(schema, timeZoneId, true, false)
+    val arrowSchema = toArrowSchema(schema, timeZoneId, true, false)
     vectorSchemaRoot = VectorSchemaRoot.create(arrowSchema, sliceAllocator)
     try {
       val recordBatch = MessageSerializer.deserializeRecordBatch(
@@ -290,7 +324,7 @@ object KyuubiArrowConverters extends SQLConfHelper with Logging {
       zstdLevel: Int)
     extends Iterator[Array[Byte]] {
 
-    protected val arrowSchema = ArrowUtils.toArrowSchema(schema, timeZoneId, true, false)
+    protected val arrowSchema = toArrowSchema(schema, timeZoneId, true, false)
     // Validate the codec before allocating Arrow buffers, so an unsupported codec fails fast.
     private val compressionEnabled = codecName match {
       case null | "none" =>
diff --git a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/common/log/InPlaceUpdate.java b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/common/log/InPlaceUpdate.java
index 4f7d562c72..fbed17e038 100644
--- a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/common/log/InPlaceUpdate.java
+++ b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/common/log/InPlaceUpdate.java
@@ -25,7 +25,6 @@ import java.io.PrintStream;
 import java.io.StringWriter;
 import java.text.DecimalFormat;
 import java.util.List;
-import javax.annotation.Nullable;
 import org.apache.commons.lang3.StringUtils;
 import org.fusesource.jansi.Ansi;
 
@@ -161,9 +160,8 @@ public class InPlaceUpdate {
         Lists.transform(
             monitor.rows(),
             new Function<List<String>, String>() {
-              @Nullable
               @Override
-              public String apply(@Nullable List<String> row) {
+              public String apply(List<String> row) {
                 return String.format(VERTEX_FORMAT, row.toArray());
               }
             });