2017-02-23 53 views
1

我在Cassandra的email_subscriptions表中添加了一个名为subscribe的新布尔列。我注意到它对于所有行'subscribe字段返回falseCassandra:回填新布尔字段

我想默认与subscribe领域为真表中所有行,但this StackOverflow answer说:

存在卡桑德拉没有默认值。

所以我的问题是了,我怎么设置我email_subscriptions表中的所有行有自己的subscribe字段设置为true?我是否需要通过批量更新回填?

+0

你是否正确地检查了它?你应该得到* null *而不是* false *。 – xmas79

回答

3

有两种方法可以做到这一点。

  • 您可以创建一个计划,该计划将选择从email_subscriptions所有记录并插入订阅=真值一起回来。

    或者

  • 当选择订阅域值,检查值为null与isNull()方法(如果列为空,将返回true,否则为false)。如果返回true,这意味着认购为null,并且该值还未插入,你可以把它当作订阅=真

0

的唯一方法是,以填补回你的整个表。根据您的表的大小,你可以在一个简单的

SELECT * FROM mytable; 

查询您的表因超时有问题。由于分区键在UPDATE语句中是必需的,因此您必须找到一种方法将分区键从该表中移出。

这是使用TOKEN函数的完美场景。假设你做了功课并且没有任何太宽的分区,可以通过将所有数据集分割成多个分区来扫描所有数据集。您的范围取决于您的数据有多宽。从一般的角度来看,您需要:

SELECT __partition_key_columns__ FROM mytable WHERE 
    TOKEN(__partition_key_columns__) >= min_range AND 
    TOKEN(__partition_key_columns__) < max_range; 

min_rangemax_range去从-2^63到2^64-1(IIRC,使用Murmur3)在推测的窗口大小的步骤W¯¯

SELECT __partition_key_columns__ FROM mytable WHERE TOKEN(__partition_key_columns__) >= -2^63 AND TOKEN(__partition_key_columns__) < -2^63 + W; 
SELECT __partition_key_columns__ FROM mytable WHERE TOKEN(__partition_key_columns__) >= -2^63 + W AND TOKEN(__partition_key_columns__) < -2^63 + 2*W; 
... 

直到你覆盖所有范围达2^64-1。如果超时,请将W更小,然后重试。如果你不这样做,那么扩大你的窗口W,这样你就可以加快这个过程。您将能够提取所有分区以发布每个范围的更新。

编辑:This blog post准确地解释如何执行这样的任务。