Spark Cassandra用区分大小写的名称编写UDT失败

问题描述

  • 使用区分大小写的字段名称时,火花连接器写入失败,并显示java.lang.IllegalArgumentException: udtId is not a field defined in this deFinition错误
  • 我需要Cassandra表中的字段来维持大小写。所以我用过 用引号创建它们。

我的Cassandra模式

CREATE TYPE my_keyspace.my_udt (
  "udtId" text,"udtValue" text
);

CREATE TABLE my_keyspace.my_table (
  "id" text PRIMARY KEY,"someCol" text,"udtCol" list<frozen<my_udt>>
);

我的Spark DataFrame架构是

root
 |-- id: string (nullable = true)
 |-- someCol: string (nullable = true)
 |-- udtCol: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- udtId: string (nullable = true)
           |-- udtValue: string (nullable = true)
  • 除了使用小写字母名称定义udt之外,还有其他选择可以使此写入工作吗?将它们设置为小写将使我在所有使用此的情况下调用案例管理代码,我想避免这种情况?
  • 因为我无法成功书写,所以我尝试阅读了吗?这也是阅读问题吗?

解决方法

您需要升级到Spark Cassandra Connector 2.5.0-我找不到修复该问题的特定提交,也没有提到该问题的特定Jira-我怀疑它首先在DataStax版本中已修复,然后作为一部分发布宣布here合并。

这是它在SCC 2.5.0 + Spark 2.4.6中的工作方式,而在SCC 2.4.2 + Spark 2.4.6中却失败:

scala> import org.apache.spark.sql.cassandra._
import org.apache.spark.sql.cassandra._

scala> val data = spark.read.cassandraFormat("my_table","test").load()
data: org.apache.spark.sql.DataFrame = [id: string,someCol: string ... 1 more field]

scala> val data2 = data.withColumn("id",concat(col("id"),lit("222")))
data2: org.apache.spark.sql.DataFrame = [id: string,someCol: string ... 1 more field]

scala> data2.write.cassandraFormat("my_table","test").mode("append").save()