问题描述
- 使用区分大小写的字段名称时,火花连接器写入失败,并显示
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()