复合列PartitionKey如何在Cassandra中工作

时间:2016-06-01 23:34:20

标签: cassandra

我试图找出复合分区键可以提供的优点。请看下面着名的气象站示例。

创建表温度( 国家文本, 城市文字, event_time时间戳, 温度文本, PRIMARY KEY((州,市),event_time) );

现在,我大部分时间都在一组城市和一系列日期中查询一个州。所以查询就像

SELECT * FROM temperature WHERE state = 'NY' AND city IN ('mahattan', 'brooklyn','queens') AND event_time > '2016-01-01'

假设我有一个大型数据集,从某种意义上说我有几个状态(#< 1000)但是对于每个州,我有很多城市(#> 100M)。我复制数据并将它们分发到不同的节点。

问题:您可以使用

比较差异吗?
PRIMARY KEY (**(state, city)**,event_time)

PRIMARY KEY (**(city, state)**,event_time)

PRIMARY KEY (state, city,event_time)

PRIMARY KEY (zipcode, event_time) 

谢谢!

1 个答案:

答案 0 :(得分:1)

复合键

PRIMARY KEY (**(state, city)**,event_time)
PRIMARY KEY (**(city, state)**,event_time)

功能相同。复合分区键将是城市和州的组合值。如果没有这两个部分,您将无法完全指定分区。在分区内,单元格将按event_time排序。您将拥有#State * #City分区

[city, state] -> [event_time_0, event_time_1, event_time_2, event_time_3, ...]

您将能够编写像

这样的查询
SELECT * FROM TABLE WHERE CITY = X AND STATE = Y AND event_time (><=) SomeValue

复合键

PRIMARY KEY (state, city,event_time)

为每个州制作一个分区。这可能是不好的,因为有100x州/省的顺序,这意味着你将只有非常少的分区。数据将按城市和event_time在分区内布局。

[Illinois] --> [Chicago, 0], [Chicago, 1], [Peoria, 0], [Peoria, 1]

如果他们也限制了活动时间,则查询必须限制城市。

PRIMARY KEY (zipcode, event_time) 

您将拥有多达10k个分区,每个事件时间都有一个单元格。