使用新的键值对更新 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
删除元素(仅适用于列表)。文档包含相关示例。
在
我有一个类型为 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
删除元素(仅适用于列表)。文档包含相关示例。