From 72bbcc6326b3c2608b21a6e50b46d354bda32936 Mon Sep 17 00:00:00 2001 From: architch Date: Mon, 23 Jun 2025 21:27:17 +0530 Subject: [PATCH 1/2] optimise byte array to hex string conversion --- .../spark/connector/types/TypeConverter.scala | 13 ++++++++++++- .../spark/connector/types/TypeConverterTest.scala | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala b/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala index 07856f764..901e67cb0 100644 --- a/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala +++ b/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala @@ -270,7 +270,18 @@ object TypeConverter { } } - private def byteArrayToString (x: Array[Byte]) = "0x" + x.map("%02x" format _).mkString + private val HEX_CHARS = Array( + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + ) + private def byteArrayToString (x: Array[Byte]) : String = { + val result = new StringBuilder(x.length * 2) + x.foreach { b => + val v = b & 0xFF + result.append(HEX_CHARS(v >>> 4)) + result.append(HEX_CHARS(v & 0x0F)) + } + "0x" + result.toString() + } private def stringToByteArray (x: String) = new BigInteger(x.substring(2), 16).toByteArray private val ByteBufferTypeTag = implicitly[TypeTag[ByteBuffer]] diff --git a/driver/src/test/scala/com/datastax/spark/connector/types/TypeConverterTest.scala b/driver/src/test/scala/com/datastax/spark/connector/types/TypeConverterTest.scala index e34e96c97..2825935bc 100644 --- a/driver/src/test/scala/com/datastax/spark/connector/types/TypeConverterTest.scala +++ b/driver/src/test/scala/com/datastax/spark/connector/types/TypeConverterTest.scala @@ -153,6 +153,13 @@ class TypeConverterTest { assertEquals("a string", c.convert("a string")) } + @Test + def testByteArrayToString() { + val c = TypeConverter.forType[String] + val byteArray : Array[Byte] = Array(1,3,-56,45,23,67) + assertEquals("0x0103c82d1743", c.convert(byteArray)) + } + @Test def testDate() { val c = TypeConverter.forType[Date] From 0db9c13c86d5337c7f664e19c42c999d08d6ed34 Mon Sep 17 00:00:00 2001 From: architch Date: Tue, 28 Oct 2025 22:53:55 +0530 Subject: [PATCH 2/2] address review : simplify --- .../com/datastax/spark/connector/types/TypeConverter.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala b/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala index 901e67cb0..99b9ddb87 100644 --- a/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala +++ b/driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala @@ -274,13 +274,13 @@ object TypeConverter { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ) private def byteArrayToString (x: Array[Byte]) : String = { - val result = new StringBuilder(x.length * 2) + val result = new StringBuilder(x.length * 2 + 2).append("0x") x.foreach { b => val v = b & 0xFF result.append(HEX_CHARS(v >>> 4)) result.append(HEX_CHARS(v & 0x0F)) } - "0x" + result.toString() + result.toString() } private def stringToByteArray (x: String) = new BigInteger(x.substring(2), 16).toByteArray