Skip to content

CASSANALYTICS-173: Add Apache Spark 4.1 support and upgrade Java driv… - #1389

Open
msmygit wants to merge 4 commits into
apache:trunkfrom
msmygit:b4.1
Open

CASSANALYTICS-173: Add Apache Spark 4.1 support and upgrade Java driv…#1389
msmygit wants to merge 4 commits into
apache:trunkfrom
msmygit:b4.1

Conversation

@msmygit

@msmygit msmygit commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

…er to 4.19.3

Upgrade the connector to Apache Spark 4.1.2 and Cassandra Java driver 4.19.3. Spark 4.x requires Java 17 and Scala 2.13, so Scala 2.12 and Java 8/11 are dropped.

Build:

  • Spark 4.1.2, Cassandra Java driver 4.19.2, Jetty 11.0.26, Scala 2.13.17
  • Build Scala 2.13 only; target Java 17 (-release 17 / javac 17)
  • Add JDK 17 --add-opens java options for forked (test) JVMs
  • Remove obsolete -XX:MaxPermSize from the sbt launcher
  • Remove unused scala-2.12 source directories

Spark 4 API migration (connector):

  • Use org.apache.spark.sql.classic.{Strategy, SparkSession, Dataset} where the Connect/Classic split moved the implementations
  • Convert Column <-> Expression via classic ClassicConversions/ColumnConversions
  • DataSourceV2Relation gained a timeTravelSpec field; update pattern matches
  • Replace removed Dataset.sqlContext / SQLContext.conf with sparkSession / sessionState.conf
  • Adapt to error-class based exception constructors (AnalysisException, NoSuch/AlreadyExists exceptions)

Docs/CI: update README version matrix, quick start and other docs to Spark 4.1 / Scala 2.13 / Java 17, add CHANGES entry, and run CI on Java 17 + Scala 2.13.

Description

How did the Spark Cassandra Connector Work or Not Work Before this Patch

Describe the problem, or state of the project that this patch fixes. Explain
why this is a problem if this isn't obvious.

Example:
"When I read from tables with 3 INTS I get a ThreeIntException(). This is a problem because I often want to read from a table with three integers."

General Design of the patch

How the fix is accomplished, were new parameters or classes added? Why did you
pursue this particular fix?

Example: "I removed the incorrect assertion which would throw the ThreeIntException. This exception was incorrectly added and the assertion is not actually needed."

Fixes: CASSANALYTICS-173

gh-pages PR is #1388

How Has This Been Tested?

Almost all changes and especially bug fixes will require a test to be added to either the integration or Unit Tests. Any tests added will be automatically run on travis when the pull request is pushed to github. Be sure to run suites locally as well.

**Expand / Collapse for local testing results **
PATH=/usr/local/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home/bin:$PATH ./sbt/sbt test

Launching sbt from sbt/sbt-launch-1.10.0.jar
[info] welcome to sbt 1.10.0 (Homebrew Java 17.0.19)
[info] loading settings for project spark-cassandra-connector-build from plugins.sbt,updates.sbt ...
[info] loading project definition from /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/project
[info] compiling 4 Scala sources to /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/project/target/scala-2.12/sbt-1.0/classes ...
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/project/Testing.scala:113:36: method getTotalPhysicalMemorySize in trait OperatingSystemMXBean is deprecated
[warn]       val sysMemoryInMB = osmxBean.getTotalPhysicalMemorySize >> 20
[warn]                                    ^
[warn] one feature warning; re-run with -feature for details
[warn] two warnings found
[info] done compiling
[info] loading settings for project root from build.sbt ...
Using Some(releases: https://oss.sonatype.org/service/local/staging/deploy/maven2) for publishing
Reading credentials from None
Running 10 Parallel Tasks
[info] set current project to root (in build file:/Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/)
[warn] there's a key that's not used by any other settings/tasks:
[warn]  
[warn] * connector / assembly / parallelExecution
[warn]   +- /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/build.sbt:38
[warn]  
[warn] note: a setting might still be used by a command; to exclude a key from this `lintUnused` check
[warn] either append it to `Global / excludeLintKeys` or call .withRank(KeyRanks.Invisible) on the key
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[warn] Credentials file /Users/mrkr/.ivy2/.credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials does not exist
[warn] Credentials file /Users/mrkr/.sbt/credentials.deploy does not exist
[info] compiling 8 Scala sources to /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/test-support/target/scala-2.13/classes ...
[info] compiling 51 Scala sources to /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/target/scala-2.13/classes ...
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:37:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,Iterable[T]]) [quickfixable]
[warn]   implicit def iterableCanBuildFrom[T] = new CanBuildFrom[T, Iterable[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:41:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,Seq[T]]) [quickfixable]
[warn]   implicit def seqCanBuildFrom[T] = new CanBuildFrom[T, Seq[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:45:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,IndexedSeq[T]]) [quickfixable]
[warn]   implicit def indexedSeqCanBuildFrom[T] = new CanBuildFrom[T, IndexedSeq[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:49:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,Vector[T]]{def apply(): scala.collection.mutable.ReusableBuilder[T,scala.collection.immutable.Vector[T]]}) [quickfixable]
[warn]   implicit def vectorCanBuildFrom[T] = new CanBuildFrom[T, Vector[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:53:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,List[T]]) [quickfixable]
[warn]   implicit def listCanBuildFrom[T] = new CanBuildFrom[T, List[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:57:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,Set[T]]) [quickfixable]
[warn]   implicit def setCanBuildFrom[T] = new CanBuildFrom[T, Set[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:61:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,scala.collection.immutable.TreeSet[T]]{def apply(): scala.collection.mutable.ReusableBuilder[T,scala.collection.immutable.TreeSet[T]]}) [quickfixable]
[warn]   implicit def treeSetCanBuildFrom[T : Ordering] = new CanBuildFrom[T, TreeSet[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:65:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[(K, V),Map[K,V]]) [quickfixable]
[warn]   implicit def mapCanBuildFrom[K, V] = new CanBuildFrom[(K, V), Map[K, V]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:69:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[(K, V),scala.collection.immutable.TreeMap[K,V]]{def apply(): scala.collection.mutable.ReusableBuilder[(K, V),scala.collection.immutable.TreeMap[K,V]]}) [quickfixable]
[warn]   implicit def treeMapCanBuildFrom[K : Ordering, V] = new CanBuildFrom[(K, V), TreeMap[K, V]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:73:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,java.util.ArrayList[T]]) [quickfixable]
[warn]   implicit def javaArrayListCanBuildFrom[T] = new CanBuildFrom[T, java.util.ArrayList[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:82:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,java.util.List[T]]) [quickfixable]
[warn]   implicit def javaListCanBuildFrom[T] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:85:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,java.util.HashSet[T]]) [quickfixable]
[warn]   implicit def javaHashSetCanBuildFrom[T] = new CanBuildFrom[T, java.util.HashSet[T]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:94:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[T,java.util.Set[T]]) [quickfixable]
[warn]   implicit def javaSetCanBuildFrom[T] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:97:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[(K, V),java.util.HashMap[K,V]]) [quickfixable]
[warn]   implicit def javaHashMapCanBuildFrom[K, V] = new CanBuildFrom[(K, V), java.util.HashMap[K, V]] {
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala-2.13/com/datastax/spark/connector/types/CanBuildFrom.scala:106:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.types.CanBuildFrom[(K, V),java.util.Map[K,V]]) [quickfixable]
[warn]   implicit def javaMapCanBuildFrom[K, V] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:75:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1,)]) [quickfixable]
[warn]   implicit def tuple1ColumnMapper[A1 : TypeTag] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:78:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2)]) [quickfixable]
[warn]   implicit def tuple2ColumnMapper[A1 : TypeTag, A2 : TypeTag] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:81:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3)]) [quickfixable]
[warn]   implicit def tuple3ColumnMapper[A1 : TypeTag, A2 : TypeTag, A3 : TypeTag] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:84:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4)]) [quickfixable]
[warn]   implicit def tuple4ColumnMapper[A1 : TypeTag, A2 : TypeTag, A3 : TypeTag, A4 : TypeTag] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:87:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5)]) [quickfixable]
[warn]   implicit def tuple5ColumnMapper[A1 : TypeTag, A2 : TypeTag, A3 : TypeTag, A4 : TypeTag, A5 : TypeTag] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:90:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6)]) [quickfixable]
[warn]   implicit def tuple6ColumnMapper[A1 : TypeTag, A2 : TypeTag, A3 : TypeTag, A4 : TypeTag, A5 : TypeTag, A6 : TypeTag] =
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:93:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7)]) [quickfixable]
[warn]   implicit def tuple7ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:98:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8)]) [quickfixable]
[warn]   implicit def tuple8ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:103:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9)]) [quickfixable]
[warn]   implicit def tuple9ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:108:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)]) [quickfixable]
[warn]   implicit def tuple10ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:113:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)]) [quickfixable]
[warn]   implicit def tuple11ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:118:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)]) [quickfixable]
[warn]   implicit def tuple12ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:124:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)]) [quickfixable]
[warn]   implicit def tuple13ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:131:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)]) [quickfixable]
[warn]   implicit def tuple14ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:137:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15)]) [quickfixable]
[warn]   implicit def tuple15ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:143:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16)]) [quickfixable]
[warn]   implicit def tuple16ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:149:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17)]) [quickfixable]
[warn]   implicit def tuple17ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:156:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18)]) [quickfixable]
[warn]   implicit def tuple18ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:163:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19)]) [quickfixable]
[warn]   implicit def tuple19ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:170:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20)]) [quickfixable]
[warn]   implicit def tuple20ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:177:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)]) [quickfixable]
[warn]   implicit def tuple21ColumnMapper[
[warn]                ^
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/mapper/ColumnMapper.scala:184:16: Implicit definition should have explicit type (inferred com.datastax.spark.connector.mapper.TupleColumnMapper[(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22)]) [quickfixable]
[warn]   implicit def tuple22ColumnMapper[
[warn]                ^
[warn] 1 deprecation (since 2.13.0); re-run with -deprecation for details
[warn] 1 feature warning; re-run with -feature for details
[warn] two warnings found
[info] done compiling
[warn] /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/driver/src/main/scala/com/datastax/spark/connector/util/NameTools.scala:128:106: match may not be exhaustive.
[warn] It would fail on the following input: None
[warn]   def getErrorString(keyspace: String, table: Option[String], suggestion: Option[Suggestions]): String = suggestion match {
[warn]                                                                                                          ^
[warn] 8 deprecations
[warn] 29 deprecations (since 2.13.0)
[warn] 20 deprecations (since 2.13.3)
[warn] 1 deprecation (since 9)
[warn] 58 deprecations in total; re-run with -deprecation for details
[warn] 3 feature warnings; re-run with -feature for details
[warn] 44 warnings found
[info] done compiling
[info] compiling 3 Scala sources to /Users/mrkr/Documents/00_coderepos/spark-cassandra-connector/connector/target/scala-2.13/classes ...
[warn] 4 deprecations (since 2.13.0); re-run with -deprecation for details
[warn] one warning found
[info] done compiling
[info] CassandraRowTest:
[info] - basicAccessTest
[info] - nullAccessTest
[info] - NoneAccessTest
[info] - nullToStringTest
[info] - nonExistentColumnAccessTest
[info] - primitiveConversionTest
[info] - collectionConversionTest
[info] - serializationTest
[info] MultiplexingSchemaListenerTest:
[info] MutableSchemaListener
[info] - should allow adding or removing listeners
[info] - should work with 0 listeners
[info] - should work with 1 listeners
[info] - should work with 2 listeners
[info] - should work with 3 listeners
[info] - should work with 4 listeners
[info] - should work with 5 listeners
[info] - should work with 6 listeners
[info] - should work with 7 listeners
[info] - should work with 8 listeners
[info] - should work with 9 listeners
[info] - should work with 10 listeners
[info] - should allow listeners to be added while triggering events
[info] LocalNodeFirstLoadBalancingPolicySpec:
[info] - should set distance to LOCAL for local node in local dc
[info] - should set distance to IGNORED for local node in different dc
[info] - should set distance to REMOTE for remote nodes
[info] - should apply configured node filter
[info] TimestampParserSpec:
[info] - should parse fast all supported date[time[zone]] formats
[info] GettableDataToMappedTypeConverterSpec:
[info] GettableDataToMappedTypeConverter
[info] - should be Serializable
[info] - should convert a CassandraRow to a case class object
[info] - should convert a CassandraRow to a case class object after being serialized/deserialized
[info] - should convert a CassandraRow to a tuple
[info] - should convert a CassandraRow to a tuple in reversed order
[info] - should convert a CassandraRow to a tuple with a subset of columns
[info] - should convert a UDTValue to a case class object
[info] - should convert a TupleValue to a Scala tuple
[info] - should allow for nesting UDTValues inside of TupleValues
[info] - should allow for nesting TupleValues inside of UDTValues
[info] - should convert nulls to Scala Nones
[info] - should convert using custom column aliases
[info] - should set property values with setters
[info] - should apply proper type conversions for columns
[info] - should convert a CassandraRow with a UDTValue into nested case class objects
[info] - should convert a CassandraRow with a UDTValue into a case class with a nested tuple
[info] - should convert a CassandraRow with an optional UDTValue
[info] - should convert a CassandraRow with a list of UDTValues
[info] - should convert a CassandraRow with a set of UDTValues
[info] - should convert a CassandraRow with a collection of UDTValues
[info] - should convert a CassandraRow with a collection of tuples
[info] - should convert a CassandraRow to a JavaBean
[info] - should convert a CassandraRow with UDTs to nested JavaBeans
[info] - should convert a CassandraRow with UDTs with Long null values to nested JavaBeans
[info] - should throw a meaningful exception when a column type is not supported
[info] - should throw a meaningful exception when a column value fails to be converted
[info] - should throw NPE with a meaningful message when a column value is null
[info] - should throw NPE when trying to access its targetTypeTag after serialization/deserialization
[info] MultipleRetryPolicySpec:
[info] MultipleRetryPolicy
[info] - should retry always if maxRetry is -1
[info] - should not retry past maxRetry
[info] - should not retry authentication errors
[info] - should retry all of our accepted exceptions
[info] ColumnTypeSpec:
[info] A ColumnType companion object
[info] - should throw InvalidArgumentException if given unsupported type
[info]   should allow to obtain a proper ColumnType
[info]   - when given a Boolean should return BooleanType
[info]   - when given a java.lang.Boolean should return BooleanType
[info]   - when given an Int should return IntType
[info]   - when given an java.lang.Integer should return IntType
[info]   - when given a Long should return BigIntType
[info]   - when given a java.lang.Long should return BigIntType
[info]   - when given a Float should return FloatType
[info]   - when given a java.lang.Float should return FloatType
[info]   - when given a Double should return DoubleType
[info]   - when given a java.lang.Double should return DoubleType
[info]   - when given a String should return VarcharType
[info]   - when given a java.lang.Short should return a SmallIntType
[info]   - when given a Short should return a SmallIntType
[info]   - when given a Byte should return a TinyIntType
[info]   - when given a java.lang.Byte should return a TinyIntType
[info]   - when given a java.lang.Short and PV3 should return a IntType
[info]   - when given a Short and PV3 should return a IntType
[info]   - when given a Byte and PV3 should return a IntType
[info]   - when given a java.lang.Byte and PV3 should return a IntType
[info]   - when given a java.util.Date should return TimestampType
[info]   - when given a java.sql.Date should return DateType
[info]   - when given a java.sql.Date and a pre V4 Protcol version should return a TimestampType
[info]   - when given a ByteBuffer should return BlobType
[info]   - when given an Array[Byte] should return BlobType
[info]   - when given an UUID should return UUIDType
[info]   - when given a List[String] should return ListType(VarcharType)
[info]   - when given a Set[InetAddress] should return SetType(InetType)
[info]   - when given a Map[Int, Date] should return MapType(IntType, TimestampType)
[info]   - when given an Option[Int] should return IntType
[info]   - when given an Option[Vector[Int]] should return ListType(IntType)
[info] TableDefSpec:
[info] A TableDef#cql method
[info]   should produce valid CQL
[info]   - when it contains no clustering columns
[info]   - when it contains clustering columns
[info]   - when it contains compound partition key and multiple clustering columns
[info]   - when it contains a column of a collection type
[info]   - when it contains compound partition key, if not exists, multiple clustering columns with sorting and options
[info] MappedToGettableDataConverterSpec:
[info] MappedToGettableDataConverter
[info] - should be Serializable
[info] - should convert a simple case class to a CassandraRow
[info] - should convert a simple case class to a UDTValue
[info] - should convert a Scala tuple to a TupleValue
[info] - should convert nested classes
[info] - should convert a nested UDTValue to a UDTValue
[info] - should convert user defined types nested in collections
[info] - should convert user defined types nested in tuples
[info] - should convert tuples nested in user defined types
[info] - should convert nulls to Scala Nones
[info] - should convert None case class to null
[info] - should convert Some case class to UDT
[info] - should convert using custom column aliases
[info] - should convert a java bean to a CassandraRow
[info] - should convert nested JavaBeans
[info] - should convert commons-lang3 Pairs to TupleValues
[info] - should convert commons-lang3 Triples to TupleValues
[info] - should throw a meaningful exception when a column has an incorrect type
[info] - should throw a meaningful exception when a tuple field has an incorrect number of components
[info] - should work after serialization/deserialization
[info] ColumnRefSpec:
[info] A FunctionCallRef should
[info] - should generate its equivalent CQL code for: f()
[info] - should generate its equivalent CQL code for: f(3)
[info] - should generate its equivalent CQL code for: f("col01")
[info] - should generate its equivalent CQL code for: f("col01","col02")
[info] - should generate its equivalent CQL code for: f("col01",1,"hello")
[info] - should generate its equivalent CQL code for: g("col01",f("col02",1,"hello"))
[info] - should be able to provide a list of columns used as actual parameters by: f()
[info] - should be able to provide a list of columns used as actual parameters by: f(3)
[info] - should be able to provide a list of columns used as actual parameters by: f("col01")
[info] - should be able to provide a list of columns used as actual parameters by: f("col01","col02")
[info] - should be able to provide a list of columns used as actual parameters by: f("col01",1,"hello")
[info] - should be able to provide a list of columns used as actual parameters by: g("col01",f("col02",1,"hello"))
[info] ReflectionUtilSpec:
[info] ReflectionUtil.findGlobalObject
[info] - should be able to find a global object
[info] - should be able to find a global object in a multi-threaded context
[info] - should be able to instantiate a singleton object based on Java class name
[info] - should cache Java class instances
[info] - should throw IllegalArgumentException when asked for a Scala object of wrong type
[info] - should throw IllegalArgumentException when asked for class instance of wrong type
[info] - should throw IllegalArgumentException when object does not exist
[info] ReflectionUtil.constructorParams
[info] - should return proper constructor param names and types for a class with a single constructor
[info] - should return main constructor's param names and types for a class with multiple constructors
[info] ReflectionUtil.getters
[info] - should return getter names and types
[info] ReflectionUtil.setters
[info] - should return setter names and types
[info] ReflectionUtil.methodParamTypes
[info] - should return method param types
[info] - should return proper method param types for generic type
[info] - should throw IllegalArgumentException if the requested method is missing
[info] CollectionColumnTypeSpec:
[info] ListType
[info] - should mark nested UDT types as frozen
[info] - should not mark non UDT types as frozen
[info] SetType
[info] - should mark nested UDT types as frozen
[info] - should not mark non UDT types as frozen
[info] MapType
[info] - should mark key UDT types as frozen
[info] - should mark value UDT types as frozen
[info] Test run started
[info] Test com.datastax.spark.connector.mapper.PropertyExtractorTest.testSimpleExtraction started
[info] Test com.datastax.spark.connector.mapper.PropertyExtractorTest.testWrongPropertyName started
[info] Test com.datastax.spark.connector.mapper.PropertyExtractorTest.testAvailableProperties started
[info] Test run finished: 0 failed, 0 ignored, 3 total, 0.011s
[info] Test run started
[info] Test com.datastax.spark.connector.types.CanBuildFromTest.testBuild started
[info] Test com.datastax.spark.connector.types.CanBuildFromTest.testSerializeAndBuild started
[info] Test com.datastax.spark.connector.types.CanBuildFromTest.testSerializeAndBuildWithOrdering started
[info] Test run finished: 0 failed, 0 ignored, 3 total, 0.011s
[info] Test run started
[info] Test com.datastax.spark.connector.mapper.TupleColumnMapperTest.testIncompleteConstructor started
[info] Test com.datastax.spark.connector.mapper.TupleColumnMapperTest.testIncompleteGetters started
[info] Test com.datastax.spark.connector.mapper.TupleColumnMapperTest.testGetters started
[info] Test com.datastax.spark.connector.mapper.TupleColumnMapperTest.testSerialize started
[info] Test com.datastax.spark.connector.mapper.TupleColumnMapperTest.testImplicit started
[info] Test com.datastax.spark.connector.mapper.TupleColumnMapperTest.testConstructor started
[info] Test com.datastax.spark.connector.mapper.TupleColumnMapperTest.testNewTable started
[info] Test run finished: 0 failed, 0 ignored, 7 total, 0.022s
[info] Test run started
[info] Test com.datastax.spark.connector.types.TypeSerializationTest.testSerializationOfCollectionTypes started
[info] Test com.datastax.spark.connector.types.TypeSerializationTest.testSerializationOfPrimitiveTypes started
[info] Test run finished: 0 failed, 0 ignored, 2 total, 0.016s
[info] Test run started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaDouble started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testInetAddress started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testYearLocalDate started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testSerializeMapConverter started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaInteger started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testChainedConverters started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testLocalTimeType started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testTreeMap started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testTreeSet started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testInt started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testMap started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testSet started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testByteArray started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testBigDecimal started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testFloat started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testDate started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testList started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testLong started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testPair started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testUUID started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testParsableDate started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testTypeAliases started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testCalendar1 started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testCalendar2 started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testLocalDate started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaDurationTypeTag started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaBigDecimal started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaInstantTypeTag started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testBoolean started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaFloat started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testUnsupportedType started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testRegisterCustomConverterExtension started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaBigInteger started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaList started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaLong started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testCassandraOption started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaBoolean started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testTimestamp started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testRegisterCustomConverter started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testSerializeCollectionConverter started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testCassandraOptionToNull started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testBigInt started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testChainedConverterSerializability started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testDouble started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaHashMap started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaHashSet started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaMapping started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testOption started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testString started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testTriple started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testOptionToNullConverter started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaArrayList started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testSqlDate started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaMap started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaSet started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaLocalDate started
[info] Test com.datastax.spark.connector.types.TypeConverterTest.testJavaLocalTime started
[info] Test run finished: 0 failed, 0 ignored, 57 total, 0.104s
[info] Test run started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testWorkWithAliasesAndHonorOverrides started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testSerializeColumnMap started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testGetters started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testColumnNameOverrideSetters started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testImplicit started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testSetters started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testGettersWithUDT started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testWorkWithAliases started
[info] Test com.datastax.spark.connector.mapper.JavaBeanColumnMapperTest.testColumnNameOverrideGetters started
[info] Test run finished: 0 failed, 0 ignored, 9 total, 0.023s
[info] Test run started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testSetters1 started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testSetters2 started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.columnNameOverrideConstructor started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testGetters1 started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testGetters2 started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testWorkWithAliasesAndHonorOverrides started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.columnNameOverrideGetters started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testNotEnoughPropertiesForWriting started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testNewTableForClassWithVars started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testNewTableForEmptyClass started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testConstructorParams1 started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testConstructorParams2 started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testNotEnoughColumnsSelectedForReading started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testImplicit started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.columnNameOverrideSetters started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testNewTableForClassWithUnsupportedPropertyType started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testWorkWithAliases started
[info] Test com.datastax.spark.connector.mapper.DefaultColumnMapperTest.testNewTableForCaseClass started
[info] Test run finished: 0 failed, 0 ignored, 18 total, 0.056s
[info] ScalaTest
[info] Run completed in 4 seconds, 520 milliseconds.
[info] Total number of tests run: 146
[info] Suites: completed 12, aborted 0
[info] Tests: succeeded 146, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Passed: Total 245, Failed 0, Errors 0, Passed 245
[info] RandomPartitionerTokenFactorySpec:
[info] RandomPartitionerTokenFactory
[info] - should create a token from String
[info] - should create a String representation of a token
[info] - should calculate the distance between tokens if right > left
[info] - should calculate the distance between tokens if right <= left
[info] - should calculate ring fraction
[info] InputMetricsUpdaterSpec:
[info] - should create updater which uses task metrics
[info] - should be thread-safe when it uses task metrics
[info] - should create updater which does not use task metrics
[info] - should create updater which uses Codahale metrics
[info] - should be thread-safe when using Codahale metrics
[info] - should create updater which doesn't use Codahale metrics
[info] Murmur3TokenFactorySpec:
[info] Murmur3TokenFactory
[info] - should create a token from String
[info] - should create a String representation of a token
[info] - should calculate the distance between tokens if right > left
[info] - should calculate the distance between tokens if right <= left
[info] - should calculate ring fraction
[info] WriteConfTest:
[info] WriteConf
[info] - should be configured with proper defaults
[info] - should allow setting the rate limit as a decimal
[info] - should allow to set consistency level
[info] - should allow to set parallelism level
[info] - should allow to set batch size in bytes
[info] - should allow to set batch size in bytes when rows are set to auto
[info] - should allow to set batch size in rows
[info] - should allow to set batch level
[info] - should allow to set batch buffer size
[info] RateLimiterSpec:
[info] RateLimiter
[info] - should not cause delays if rate is not exceeded
[info] - should sleep to not exceed the target rate
[info] - should sleep and leak properly with different Rates
[info] ColumnSelectorSpec:
[info] A ColumnSelector#selectFrom method
[info] - should return all columns
[info] - should return partition key columns
[info] - should return some columns
[info] - should return selections with function calls
[info] - should throw a NoSuchElementException when selected column name is invalid
[info] - should throw a NoSuchElementException when a function call has a missing column as an actual parameter
[info] OutputMetricsUpdaterSpec:
[info] - should create updater which uses task metrics
[info] - should create updater which does not use task metrics
[info] - should create updater which uses Codahale metrics
[info] - should create updater which doesn't use Codahale metrics
[info] - should work correctly with multiple threads
[info] DeprecationSpec:
[info] The Spark Cassandra Connector
[info] - should deprecate ConnectionConf
[info] - should deprecate ReadConf
[info] - should deprecate WriteConf
[info] - should deprecate SoureConf
[info] WriteOptionTest:
[info] TTLOption
[info] - should properly create constant write option with duration in seconds
[info] - should properly create constant write option with scala.concurrent.duration.Duration
[info] - should properly create constant write option with scala.concurrent.duration.Duration.Infinite
[info] - should properly create constant write option with org.joda.time.Duration
[info] - should properly create infinite duration
[info] - should properly create per-row duration placeholder
[info] TimestampOption
[info] - should properly create constant write option with timestamp in microseconds
[info] - should properly create constant write option with DateTime
[info] - should properly create constant write option with Date
[info] ConsolidateSettingsSpec:
[info] - should use SparkConf settings by default
[info] - should override SparkConf settings by SQLContext settings
[info] - should override global SQLContext settings by cluster level settings
[info] - should override cluster level SQLContext settings by keyspace level settings
[info] - should override keyspace level SQLContext settings by table level settings
[info] - should be case insensitive in table conf options
[info] AnyObjectFactoryTest:
[info] AnyObjectFactory
[info]   when instantiated for a bean class with a single, no-args constructor
[info]   - should create an instance of that class with newInstance
[info]   - should return 0 with argCount
[info]   - should return empty collection with constructorParamTypes
[info]   - should return that class with javaClass
[info]   when instantiated for a bean class with multiple constructors which include no-args constructor
[info]   - should create an instance of that class with newInstance
[info]   - should return that class with javaClass
[info]   when instantiated for an inner Java class
[info]   - should create an instance of that class with newInstance
[info]   - should return that class with javaClass
[info]   when instantiated for a deeply nested inner Java class
[info]   - should create an instance of that class with newInstance
[info]   - should return that class with javaClass
[info]   when tried to be instantiated for an unsupported bean class
[info]   - should throw NoSuchMethodException if class does not have suitable constructor
[info]   when instantiated for a Scala case class with 2 args constructor
[info]   - should create an instance of that class with newInstance
[info]   - should return 2 with argCount because the only constructor of this case class has two args
[info]   - should return collection of {Int, String} types with constructorParamTypes
[info]   - should return that class with javaClass
[info]   when instantiated for a Scala case class with 2 args constructor which is defined inside an object
[info]   - should create an instance of that class with newInstance
[info]   - should return 2 with argCount because the only constructor of this case class has two args
[info]   - should return collection of {Int, String} types with constructorParamTypes
[info]   - should return that class with javaClass
[info]   when instantiated for a Scala class with 2 args constructor
[info]   - should create an instance of that class with newInstance
[info]   - should return 2 with argCount because the only constructor of this class has 2 args
[info]   - should return collection of {Int, String} types with constructorParamTypes
[info]   - should return that class with javaClass
[info]   when instantiated for a Scala class with 2 args constructor and without fields
[info]   - should create an instance of that class with newInstance
[info]   - should return 2 with argCount because the only constructor of this class has 2 args
[info]   - should return collection of {Int, String} types with constructorParamTypes
[info]   - should return that class with javaClass
[info]   when instantiated for a Scala class with multiple constructors
[info]   - should create an instance of that class with newInstance
[info]   - should return that class with javaClass
[info]   when instantiated for an inner Scala class with 2 args constructor
[info]   - should create an instance of that class with newInstance
[info]   - should return 2 with argCount
[info]   - should return collection of {Int, String} types with constructorParamTypes
[info]   - should return that class with javaClass
[info]   when instantiated for a deeply nested inner Scala class
[info]   - should create an instance of that class with newInstance
[info]   - should return that class with javaClass
[info]   when serialized
[info]   - should allow to be deserialized and reused
[info] BucketingRangeIndexSpec:
[info] BucketingRangeIndex
[info] - should find ranges containing given point when ranges do not overlap
[info] - should find ranges containing given point when ranges do overlap
[info] - should find proper ranges when they wrap around
[info] LongTokenBucketing
[info] - should respect the required bucket range
[info] - should be weakly monotonic
[info] BigIntTokenBucketing
[info] - should respect the required bucket range
[info] - should be weakly monotonic
[info] Murmur3Bucketing
[info] - should map all tokens to a single wrapping range
[info] RandomBucketing
[info] - should map all tokens to a single wrapping range
[info] TokenRangeSpec:
[info] LongRanges 
[info] - should contain tokens with easy no wrapping bounds
[info] - should contain tokens with wrapping bounds in
[info] BigRanges 
[info] - should contain tokens with easy no wrapping bounds
[info] - should contain tokens with wrapping bounds in
[info] InClausePredicateRulesSpec:
[info] InClausePredicateRules
[info] - should leave partition and clustering filters if 'IN' filters are absent
[info] - should remove clustering filters if cartesian product of number of values is above threshold but partition values cartesian number is below the threshold
[info] - should remove partition and clustering filters if cartesian product of number of values is above threshold
[info] PredicatePushDownSpec:
[info] BasicCassandraPredicatePushDown
[info] - should push down all equality predicates restricting partition key columns
[info] - should work if the user tries to use a TimeUUID on a fully handled predicate
[info] - should work if the user tries to use a TimeUUID column in a eq predicate
[info] - should not push down a partition key predicate for a part of the partition key
[info] - should not push down a range partition key predicate
[info] - should push down an IN partition key predicate on the last partition key column
[info] - should push down an IN partition key predicate on the non-last partition key column
[info] - should push down an IN partition key predicate on all partition key columns
[info] - should not push down an IN partition key predicate on the non-last partition key column for V3 and older
[info] - should push down the first clustering column predicate
[info] - should push down the first and the second clustering column predicate
[info] - should push down restrictions on only the initial clustering columns
[info] - should push down only one range predicate restricting the first clustering column, if there are more range predicates on different clustering columns
[info] - should push down multiple range predicates for the same clustering column
[info] - should push down clustering column predicates when the last clustering column is restricted by IN
[info] - should stop pushing down clustering column predicates on the first range predicate
[info] - should not push down IN restriction on non-last column for V3 and older
[info] - should push down IN restriction on non-last clustering column
[info] - should push down IN restriction on all clustering columns
[info] - should not push down any clustering column predicates, if the first clustering column is missing
[info] - should not push down partition key index equality predicates in P3
[info] - should push down partition key index equality predicates
[info] - should push down equality predicates on regular indexed columns
[info] - should not push down range predicates on regular indexed columns
[info] - should not push down IN predicates on regular indexed columns
[info] - should push down predicates on regular non-indexed and indexed columns
[info] - should not push down predicates on regular non-indexed columns if indexed ones are not included
[info] - should prefer to push down equality predicates over range predicates
[info] - should not push down unsupported predicates
[info] DsePredicateRulesSpec:
[info] DSE Predicate Rules
[info] - should un-push all other predicates if solr_query exists
[info] it
[info] - should do nothing if solr_query is not present in a query
[info] CassandraConnectorConfSpec:
[info] - should be serializable
[info] - should match a conf with the same settings
[info] - should resolve default SSL settings correctly
[info] - should resolve provided SSL settings correctly
[info] - should produce serializedConfString that disregards names in hosts
[info] - should be equal to a conf with the same settings and hosts
[info] - should be not equal to a conf with the same settings and different hosts
[info] - should be equal to a conf with the same hosts in different order
[info] - should be not equal to a conf with the same hosts but different settings
[info] - should not be equal to a conf with the same settings and different hosts if no host is common
[info] CqlWhereParserTest:
[info] CqlWhereParser
[info] - should parse 'and' operations
[info] - should parse equality predicates
[info] - should parse range predicates
[info] - should parse IN predicates
[info] - should parse quoted names
[info] - should return lowercase names
[info] - should parse strings
[info] - should distinguish '?' from ?
[info] - should accept >=
[info] - should accept ?
[info] - should accept name with quotes and other special symbols
[info] - should accept param with quotes and other special symbols
[info] - should accept uuid param
[info] - should accept float param
[info] - should parse case insensitive 'aNd' operations
[info] - should parse case insensitive 'iN' operations
[info] - should parse case insensitive 'IN' operations ?
[info] - should handle long string requests
[info] MergeJoinIteratorSpec:
[info] MergeJoinIterator
[info] - should group an empty collection
[info] - should group two sequences with the same key into a single item and preserve order
[info] - should group a sequence of elements with distinct keys the same number of groups
[info] - should group a sequence of elements with two keys into two groups
[info] - should be lazy and work with infinite streams
[info] - should take from two unabalanced but ordered streams
[info] - should work with more complicated keys
[info] CqlWhereClauseSpec:
[info] - should produce a string for each predicate
[info] - should produce empty predicate string for empty predicate list
[info] - should produce valid string for IN clause predicate
[info] - should complain when the number of values doesn't match the number of placeholders '?'
[info] SolrPredicateRulesSpec:
[info] Solr Predicate Rules
[info] - should convert easy predicates to a solr query
[info] - should convert an OR filter
[info] - should convert a large conjugated tree
[info] - should not convert conjunctions with non solr indexed attributes
[info] - should be able to convert only some filters if some are non indexed
[info] - should be able to convert string like filters
[info] - should be able to convert string contains filters
[info] - should be able to convert compound NOT IN clauses
[info] - should be able to convert Null predicates
[info] - should be able to convert GreaterThanEquals and LessThanEquals
[info] Murmur3PartitionerTokenRangeSplitterSpec:
[info] Murmur3PartitionerSplitter
[info] - should split tokens
[info] - should split token sequences
[info] BufferedIterator2Spec:
[info] BufferedIterator
[info] - should return the same items as the standard Iterator
[info] - should be convertible to a Seq
[info] - should wrap an empty iterator
[info] - should offer the head element without consuming the underlying iterator
[info] - should offer takeWhile that consumes only the elements matching the predicate
[info] - should offer appendWhile that copies elements to ArrayBuffer and consumes only the elements matching the predicate
[info] - should throw NoSuchElementException if trying to get next() element that doesn't exist
[info] ConfigCheckSpec:
[info] ConfigCheck
[info] - should throw an exception when the configuration contains a invalid spark.cassandra prop
[info] - should suggest alternatives if you have a slight misspelling
[info] - should suggest alternatives if you miss a word
[info] - should not throw an exception if you have a random variable not in the spark.cassandra space
[info] - should not list all options as suggestions
[info] - should not give suggestions when the variable is very strange
[info] - should accept custom ConnectionFactory properties
[info] - should accept custom AuthConfFactory properties
[info] DefaultConnectionFactoryTest:
[info] - should complain when a malformed URL is provided
[info] - should complain when an URL with unrecognized scheme is provided
[info] SpanningIteratorSpec:
[info] SpanningIterator
[info] - should group an empty collection
[info] - should group a sequence of elements with the same key into a single item and should preserve order
[info] - should group a sequence of elements with distinct keys the same number of groups
[info] - should group a sequence of elements with two keys into two groups
[info] - should be lazy and work with infinite streams
[info] PriorityHashMapSpec:
[info] A PriorityHashMap
[info] - should support adding elements (simple)
[info] - should support adding elements ascending by value
[info] - should support adding elements descending by value
[info] - should support adding elements in random order of values
[info] - should support adding elements in random order of values and keys
[info] - should support removing elements in ascending order
[info] - should support removing elements in descending order
[info] - should support removing elements in random order from a sorted map
[info] - should support removing elements from a randomly created map in random order
[info] - should allow to heapsort an array of integers
[info] - should allow to update item priority
[info] - should be able to store multiple items with the same priority
[info] - should return false when removing a non-existing key
[info] - should have capacity rounded up to the nearest power of two
[info] - should throw NoSuchElement exception if requested a head of empty map
[info] - should throw NoSuchElement exception if requested a non-existing key
[info] - should throw IllegalStateException exception if trying to exceed allowed capacity
[info] RandomPartitionerTokenRangeSplitterSpec:
[info] RandomPartitionerSplitter
[info] - should split tokens
[info] - should split token sequences
[info] Test run started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testWithConnector started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testWithReadConf started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testWithAscOrder started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testSelectColumnNames started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testLimit started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testWhere started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testSelectColumns started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testSelectedColumnRefs started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testSelectedColumnNames started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testWithDescOrder started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaPairRDDTest.testPerPartitionLimit started
[info] Test run finished: 0 failed, 0 ignored, 11 total, 0.095s
[info] Test run started
[info] Test com.datastax.spark.connector.writer.DefaultRowWriterTest.testTypeConversionsInUDTValuesAreApplied started
[info] Test com.datastax.spark.connector.writer.DefaultRowWriterTest.testTypeConversionsAreApplied started
[info] Test com.datastax.spark.connector.writer.DefaultRowWriterTest.testSerializability started
[info] Test com.datastax.spark.connector.writer.DefaultRowWriterTest.testCustomTypeConvertersAreUsed started
[info] Test run finished: 0 failed, 0 ignored, 4 total, 0.248s
[info] Test run started
[info] Test com.datastax.spark.connector.japi.SparkContextJavaFunctionsTest.testReadConfPopulating started
[info] Test run finished: 0 failed, 0 ignored, 1 total, 0.064s
[info] Test run started
[info] Test com.datastax.spark.connector.rdd.reader.ClassBasedRowReaderTest.testSerialize started
[info] Test run finished: 0 failed, 0 ignored, 1 total, 0.046s
[info] Test run started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapColumnToListOf started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testJavaFunctions started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapColumnToMapOf started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapColumnToSetOf started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapColumnTo1 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapColumnTo2 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapColumnTo3 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testTypeConverter1 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testTypeConverter2 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testTypeConverter3 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testTypeConverter4 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testTypeTag1 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testTypeTag2 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testTypeTag3 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testJavaFunctions1 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testJavaFunctions4 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testJavaFunctions5 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapRowTo1 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapRowTo2 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapRowTo3 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testMapRowTo4 started
[info] Test com.datastax.spark.connector.CassandraJavaUtilTest.testConvertToMap started
[info] Test run finished: 0 failed, 0 ignored, 22 total, 0.083s
[info] Test run started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetBytes started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetFloat started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetShort started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGet started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testToMap started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetByte started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetDate started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetInet started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetList started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetLong started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetUUID started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetObjectAndApply started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetBoolean started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetDouble started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetInt started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetMap started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetSet started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetString started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetVarInt started
[info] Test com.datastax.spark.connector.japi.CassandraRowTest.testGetDecimal started
[info] Test run finished: 0 failed, 0 ignored, 20 total, 0.03s
[info] Test run started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJoinJavaRDDTest.testOn started
[info] Test run finished: 0 failed, 0 ignored, 1 total, 0.033s
[info] Test run started
[info] Test com.datastax.spark.connector.writer.AsyncExecutorTest.test started
[info] Test com.datastax.spark.connector.writer.AsyncExecutorTest.testGracefullyHandleCqlSessionExecuteExceptions started
[info] Test run finished: 0 failed, 0 ignored, 2 total, 0.467s
[info] Test run started
[info] Test com.datastax.spark.connector.rdd.partitioner.TokenRangeClustererTest.testTrivialClustering started
[info] Test com.datastax.spark.connector.rdd.partitioner.TokenRangeClustererTest.testMaxGroupSize started
[info] Test com.datastax.spark.connector.rdd.partitioner.TokenRangeClustererTest.testMultipleEndpoints started
[info] Test com.datastax.spark.connector.rdd.partitioner.TokenRangeClustererTest.testEmpty started
[info] Test com.datastax.spark.connector.rdd.partitioner.TokenRangeClustererTest.testSplitByHost started
[info] Test com.datastax.spark.connector.rdd.partitioner.TokenRangeClustererTest.testSplitByCount started
[info] Test run finished: 0 failed, 0 ignored, 6 total, 0.023s
[info] Test run started
[info] Test com.datastax.spark.connector.CassandraStreamingJavaUtilTest.testJavaFunctions2 started
[info] Test com.datastax.spark.connector.CassandraStreamingJavaUtilTest.testJavaFunctions3 started
[info] Test com.datastax.spark.connector.CassandraStreamingJavaUtilTest.testJavaFunctions6 started
[info] Test com.datastax.spark.connector.CassandraStreamingJavaUtilTest.testJavaFunctions7 started
[info] Test run finished: 0 failed, 0 ignored, 4 total, 0.059s
[info] Test run started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testWithConnector started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testWithReadConf started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testWithAscOrder started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testSelectColumnNames started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testLimit started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testWhere started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testSelectColumns started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testSelectedColumnRefs started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testSelectedColumnNames started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testWithDescOrder started
[info] Test com.datastax.spark.connector.japi.rdd.CassandraJavaRDDTest.testPerPartitionLimit started
[info] Test run finished: 0 failed, 0 ignored, 11 total, 0.008s
[info] ScalaTest
[info] Run completed in 7 seconds, 12 milliseconds.
[info] Total number of tests run: 233
[info] Suites: completed 28, aborted 0
[info] Tests: succeeded 233, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Passed: Total 316, Failed 0, Errors 0, Passed 316
[success] Total time: 25 s, completed Jun 8, 2026, 6:55:28 PM

Checklist:

  • I have a ticket in the JIRA
  • I have performed a self-review of my own code
  • Locally all tests pass (make sure tests fail without your patch)

Madhavan added 2 commits June 5, 2026 23:50
…er to 4.19.2

Upgrade the connector to Apache Spark 4.1.2 and Cassandra Java driver 4.19.2.
Spark 4.x requires Java 17 and Scala 2.13, so Scala 2.12 and Java 8/11 are
dropped.

Build:
 * Spark 4.1.2, Cassandra Java driver 4.19.2, Jetty 11.0.26, Scala 2.13.17
 * Build Scala 2.13 only; target Java 17 (-release 17 / javac 17)
 * Add JDK 17 --add-opens java options for forked (test) JVMs
 * Remove obsolete -XX:MaxPermSize from the sbt launcher
 * Remove unused scala-2.12 source directories

Spark 4 API migration (connector):
 * Use org.apache.spark.sql.classic.{Strategy, SparkSession, Dataset} where the
   Connect/Classic split moved the implementations
 * Convert Column <-> Expression via classic ClassicConversions/ColumnConversions
 * DataSourceV2Relation gained a timeTravelSpec field; update pattern matches
 * Replace removed Dataset.sqlContext / SQLContext.conf with sparkSession /
   sessionState.conf
 * Adapt to error-class based exception constructors (AnalysisException,
   NoSuch/AlreadyExists exceptions)

Docs/CI: update README version matrix, quick start and other docs to Spark 4.1
/ Scala 2.13 / Java 17, add CHANGES entry, and run CI on Java 17 + Scala 2.13.
Spark 4 repackaged the streaming internals and split SQLImplicits/SparkSession.
Update the integration-test fixtures accordingly:
 * Import LongOffset/SerializedOffset/StreamingQueryWrapper from the new
   org.apache.spark.sql.execution.streaming.runtime package
 * Use classic Dataset.ofRows with the classic SparkSession in the fake stream
   sources; make offset branches consistently Long
 * Use the session's built-in implicits instead of a hand-rolled SQLImplicits
   subclass (SQLImplicits gained abstract members)
 * Cast to the classic SparkSession for cloneSession()

Also point generateDocs.sh at the scala-2.13 output directory.
Madhavan added 2 commits June 8, 2026 11:23
…17 opens to IT forks

 * Bump Scala to 2.13.18 (build + CI matrix) and Cassandra Java driver to 4.19.3
 * Add the JDK 17 --add-opens options to the integration-test group fork JVMs
   in Testing.scala; makeTestGroups builds its own ForkOptions and would
   otherwise drop them, making Spark fail under Java 17 during it:test
…k 4 (found via it:test)

Running the integration tests against Cassandra surfaced three Spark 4 regressions:

 * setDirectJoin: Spark 4's .load() returns a lazy UnresolvedDataSource as the
   parsed logical plan, so transforming queryExecution.logical matched nothing
   and the directJoin() hint was silently dropped. Transform the analyzed plan
   instead, and match the CassandraTable inside DataSourceV2ScanRelation (its
   first field is the relation in Spark 4, not the table).

 * CassandraCatalog.tableMissing/namespaceMissing: Spark 4 removed the free-form
   message constructors from NoSuchTable/NamespaceException, which dropped the
   NameTools 'Couldn't find / did you mean' suggestions. Override getMessage on
   the typed exception to preserve the suggestion text.

 * CassandraCatalogSpecBase: Spark 4 no longer treats spark.sql.defaultCatalog as
   the current catalog; select it explicitly via catalogManager.setCurrentCatalog
   after setting the active session (plugin loading resolves against it).

Verified against Cassandra 5.0.4 on JDK 17: CassandraDirectJoinSpec 35/35,
CassandraDataSourceSpec 33/33, CassandraDataFrameSpec 14/14, TableWriterSpec
66/66, CassandraCatalogNamespaceSpec 14/14, CassandraCatalogTableSpec 21/21.
Unit tests remain green (245 + 316).
@vinayak355

Copy link
Copy Markdown

Hi Team,

Please check if the support for default keyspace can be added in clCatalog.

As like MySQL Catalog, there is option to set defaultDatabase

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants