Ошибка показывает:
Вызвано: java .lang.NullPointerException: запрошен TypeTag для GettableToMappedTypeConverter, который не может десериализовать TypeTags из-за Scala 2.10 ограничения TypeTag. Они возвращаются как пустые значения, и поэтому вы видите этот NPE.
gradle.build
dependencies {
implementation group: 'org.scala-lang', name: 'scala-library', version: '2.12.11'
implementation group: 'org.apache.spark', name: 'spark-core_2.12', version: '2.4.5'
implementation group: 'org.apache.spark', name: 'spark-sql_2.12', version: '2.4.5'
implementation group: 'com.datastax.spark', name: 'spark-cassandra-connector_2.12', version: '2.5.0'
implementation group: 'org.apache.spark', name: 'spark-mllib_2.12', version: '2.4.5'
implementation group: 'log4j', name: 'log4j', version: '1.2.17'
implementation group: 'org.scalaj', name: 'scalaj-http_2.12', version: '2.4.2'
}
Scala объект
object SparkModule {
case class UDTCaseClass(a: Int = 0, b: Float = 0f, c: Int = 0, d: Int = 0)
case class TableCaseClass(id: UUID, col1: Boolean, list: List[UDTCaseClass])
val spark = SparkSession.builder
.master("local[2]")
.appName("App")
.config("spark.cassandra.connection.host", "127.0.0.1")
.config("spark.cassandra.connection.port", "9042")
.config("spark.executor.cores", "1")
.getOrCreate()
val sc = spark.sparkContext
sc.setLogLevel("WARN")
val cassandraRDD = sc.cassandraTable[TableCaseClass](
"keyspace", "table"
).limit(20)
println(cassandraRDD.count())
}
Сначала иногда ошибка показывалась, а иногда нет, пока я не сузил ее и не понял, что она показывает, когда любое из полей UDT имеет значение null
, в противном случае все работает нормально. Например, если таблица содержит одну из следующих строк, возникает ошибка:
f39b5201-1e96-44a8-946 c -d959c217f174 | Ложь | [{a: 123, b: 2.3, c: 33, d: null }]
f39b5201-1e96-44a8-946 c -d959c217f174 | Ложь | [{a: 123, b: 2.3, c: null , d: 34}]
f39b5201-1e96-44a8-946 c -d959c217f174 | Ложь | [{a: 123, b: null , c: 33, d: 12}]
f39b5201-1e96-44a8-946 c -d959c217f174 | Ложь | [{a: null , b: 2.3, c: 33, d: 22}]
тогда как, например, этот:
f39b5201-1e96-44a8-946 c -d959c217f174 | Ложь | null
отлично читается cassandraTable
.
Я пробовал использовать Option
вот так: case class UDTCaseClass(a: Option[Int] = None, b: Option[Float] = None, c: Option[Int] = None, d: Option[Int] = None)
, но появляется та же ошибка.
Я всегда мог просто вставить 0 вместо null
, но можно ли этого избежать?
Спасибо