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 驱动程序类的代码,例如,withClusterDowithSessionDo,然后迁移很简单。此外,此版本还带来了很多优化,例如直接加入等 - 请阅读相关链接的博客文章

以上是关于Spark Cassandra 使用区分大小写的名称写入 UDT 失败的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra (Datastax) CQL 忽略 TEXT 列的大小写

Spark-Cassandra 与 Spark-Elasticsearch

Cassandra:节点变得不可用,同时使用 Spark 摄取

无法使用 Spark cassandra 连接器 1.5.0 连接 Cassandra 3.0

如何用Cassandra连接火花

使用 ForeachWriter 在 Spark 流中实现 Cassandra 接收器