使用新的键值对更新 Cassandra 中的地图类型列,而不是完全覆盖地图

Update Map type columns in Cassandra with new key value pairs and not completely overwrite the map

继续提问。

我有一个类型为 Dataset[(String, Map[String, String])] 的 Spark Dataset。

我必须将其插入 Cassandra table。

在这里,Dataset[(String, Map[String, String])] 中的键将成为我在 Cassandra 中的行的主键。

Dataset[(String, Map[String, String])] 中的地图将在 ColumnNameValueMap 列的同一行中。

我的 Cassandra table 结构是:

CREATE TABLE SampleKeyspace.CassandraTable (
  RowKey text PRIMARY KEY,
  ColumnNameValueMap map<text,text>
);

我能够使用 Spark Cassandra 连接器将数据插入 Cassandra table。

现在,我正在使用同一行键(第一个 column/primary 键)的新键值更新同一映射列(第二列)。但是,对此专栏的每次新更新都会清除以前的地图。

如何使用 Spark Cassandra 连接器附加相同的地图?

我不认为直接从 Dataframe API 可以做到这一点,但我t's possible to do via RDD API。例如,我有以下带有一些测试数据的表格:

CREATE TABLE test.m1 (
    id int PRIMARY KEY,
    m map<int, text>
);
cqlsh> select * from test.m1;                                                                                                                                                                                                  id | m                                                                                                        ----+--------------------                                                                                        1 | {1: 't1', 2: 't2'}                                                                                                                                                                                                      (1 rows)

我在 Spark 中有数据:

scala> val data = Seq((1, Map(3 -> "t3"))).toDF("id", "m")                                                     data: org.apache.spark.sql.DataFrame = [id: int, m: map<int,string>]

然后我可以通过以下代码指定我要将数据附加到特定列:

data.rdd.saveToCassandra("test", "m1", SomeColumns("id", "m" append))

我可以看到数据已更新:

cqlsh> select * from test.m1;
id | m
----+----------------------------- 
 1 | {1: 't1', 2: 't2', 3: 't3'}
(1 rows)

除了 append 之外,还支持使用 remove 选项和 prepend 删除元素(仅适用于列表)。文档包含相关示例。