更新cassandra行spark cassandra

时间:2015-09-28 14:05:53

标签: apache-spark spark-cassandra-connector

我正在使用spark 1.2 with spark cassandra connector 1.2.3, 我正在尝试更新表的somme行:

示例:

CREATE TABLE myTable ( 
a text, 
b text, 
c text, 
date timestamp, 
d text, 
e text static, 
f text static, 
PRIMARY KEY ((a, b, c), date, d) 
) WITH CLUSTERING ORDER BY (date ASC, d ASC)

val interactions = sc.cassandraTable[(String, String, String, DateTime, String, String)]("keySpace", "myTable"). 
select("a","b","c","date", "d", "e","f") 
val empty = interactions.filter(r => r._6 == null).cache() 
empty.count()

我只计算“e”中包含null的行数,并按“b”的值重新计算

 val update_inter = empty.map( r =>  (r._1,r._2, r._3, r._4, r._5, r._2)) 
 update_inter.saveToCassandra("keySpace", "myTable", SomeColumns("a","b","c","date", "d", "e", "f"))

这在我检入cqlsh时有效,但当我通过spark cassandra请求相同的行时,我仍然得到值null。

这是spark cassandra连接器中的错误吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

当发生插入/更新时,Cassandra会在另一个SSTable中写入已插入或更新的数据的新时间戳版本,而不是覆盖行。

您的Spark作业要么不更新现有行,而是写入新行,或者您的SSTable尚未将更改写入磁盘。如果您要将结果写入新表,则计数为null' e'列将为零。

尝试使用nodetool flush命令并阅读:Cassandra Compaction

答案 1 :(得分:0)

.mode('append')用于追加我猜。我面临类似的问题,但使用java连接器但似乎在python这个选项是可用的