Spark Cassandra 使用区分大小写的名称写入 UDT 失败
Spark Cassandra Write UDT With Case-Sensitive Names Fails
- 使用区分大小写的字段名称时,Spark 连接器写入失败并出现
java.lang.IllegalArgumentException: udtId is not a field defined in this definition
错误
- 我需要 Cassandra table 中的字段来保持大小写。所以我用过
引用来创建它们。
我的 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()
- 使用区分大小写的字段名称时,Spark 连接器写入失败并出现
java.lang.IllegalArgumentException: udtId is not a field defined in this definition
错误 - 我需要 Cassandra table 中的字段来保持大小写。所以我用过 引用来创建它们。
我的 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()