Spark Cassandra 使用区分大小写的名称写入 UDT 失败
Posted
技术标签:
【中文标题】Spark Cassandra 使用区分大小写的名称写入 UDT 失败【英文标题】:Spark Cassandra Write UDT With Case-Sensitive Names Fails 【发布时间】:2021-01-01 06:33:24 【问题描述】: 使用区分大小写的字段名称时,Spark 连接器写入失败并出现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 之外,还有其他选项可以让这个写入工作吗?将它们设为小写会使我在使用它的任何地方调用案例管理代码,我想避免这种情况?
因为我写不成功,我试过读了吗?这也是读取的问题吗?
【问题讨论】:
什么是 SCC 版本? 我使用的是连接器 2.4.2。 JDK 11 和 Scala 2.12 忘了问 - 什么 Spark 版本?期待 Scala 2.12,我怀疑它是 Spark 3.0? 没问题。我也应该提到。我正在使用 Spark 2.4.5。仅供参考,我尝试在数据框中的 udt 字段中添加引号,但这也无济于事 【参考方案1】:您需要升级到 Spark Cassandra 连接器 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()
【讨论】:
这适用于 2.5.0。我会考虑升级到 2.5.0 连接器版本。 直到您不使用一些依赖于 Java 驱动程序类的代码,例如,withClusterDo
、withSessionDo
,然后迁移很简单。此外,此版本还带来了很多优化,例如直接加入等 - 请阅读相关链接的博客文章以上是关于Spark Cassandra 使用区分大小写的名称写入 UDT 失败的主要内容,如果未能解决你的问题,请参考以下文章
Cassandra (Datastax) CQL 忽略 TEXT 列的大小写
Spark-Cassandra 与 Spark-Elasticsearch
Cassandra:节点变得不可用,同时使用 Spark 摄取