Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用新的键值对更新Cassandra中的映射类型列,但不要完全覆盖映射_Scala_Apache Spark_Cassandra_Spark Cassandra Connector - Fatal编程技术网

Scala 使用新的键值对更新Cassandra中的映射类型列,但不要完全覆盖映射

Scala 使用新的键值对更新Cassandra中的映射类型列,但不要完全覆盖映射,scala,apache-spark,cassandra,spark-cassandra-connector,Scala,Apache Spark,Cassandra,Spark Cassandra Connector,继续质询 我有一个Dataset[(String,Map[String,String])类型的Spark数据集 我必须将其插入Cassandra表中 在这里,数据集中的键[(String,Map[String,String])]将成为Cassandra中该行的主键 数据集中的映射[(String,Map[String,String])]将位于ColumnNameValueMap列的同一行中 我的Cassandra表结构是: CREATE TABLE SampleKeyspace.Cassandr

继续质询

我有一个Dataset[(String,Map[String,String])类型的Spark数据集

我必须将其插入Cassandra表中

在这里,数据集中的键[(String,Map[String,String])]将成为Cassandra中该行的主键

数据集中的映射[(String,Map[String,String])]将位于ColumnNameValueMap列的同一行中

我的Cassandra表结构是:

CREATE TABLE SampleKeyspace.CassandraTable (
  RowKey text PRIMARY KEY,
  ColumnNameValueMap map<text,text>
);
CREATE TABLE SampleKeyspace.CassandraTable(
行键文本主键,
ColumnNameValueMap
);
我能够使用Spark Cassandra连接器在Cassandra表中插入数据

现在,我正在使用同一行键(第1列/主键)的新键值更新同一映射列(第2列)。但是,本专栏的每一次更新都会清除以前的地图。


如何使用Spark Cassandra connector附加相同的映射?

我认为不可能直接从Dataframe 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)
我可以看到数据已经更新:

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

除了
append
,还支持使用
remove
选项和
prepend
删除元素(仅适用于列表)。文档中包含了这方面的示例。

谢谢您的帮助。在你回答之前我也这么做了。我期待您提供数据帧支持:)。无论如何,谢谢你的帮助。已经投票并接受了答案。你可以提交JIRA。。。也许它的实现速度足够快…顺便说一句,如果您只有一个集合列,那么您可以改为更改数据模型-改为
创建表测试(分区键文本、映射键文本、值文本、主键(分区键、映射键))-它的工作原理与map相同,但您可以更轻松地选择单个值,并且开销更小。这一点将使spark job中要写入cassandra的输出的大小增加很多倍。我最终将代码还原为使用Dataset[(String,Map(String,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)