live定位cassandra分区key策略
Live location cassandra partition key strategy
我正在观看有关 Uber 使用 Cassandra 进行实时位置存储的 talk,并对分区键感到好奇。我最初的思路是有以下字段:
- ride_id
- driver_id
- 时间戳
- 纬度
- 经度
对于分区键,我介于以下之间:
- 复合主键(ride_id、driver_id)
- 主键(ride_id)
- 主键(driver_id)
查询时,我想查询给定行程的位置数据,并可能查询给定 driver 的位置数据。创建复合键有意义吗?我希望每个节点都有 ~100k 行。我是否也可以有两个单独的重复数据表但索引不同,以便我可以根据索引进行查询?
在 Uber 谈话中,他们提到他们使用 uuid(我假设与 driver 或乘车相关)和时间戳的分钟偏移量作为分区键。这是更好的方法吗?
在Cassandra数据建模中,首要的objective是为每个应用查询设计一个table。另一种表达方式是 table 和应用查询具有 one-to-one 关系:一个应用查询映射到一个 table。如果有10个app查询,需要设计10个tables.
[编辑] - 在评论中获得更多信息后更新了我的答案。
对于此应用查询:
I would want to query for the location data for a given trip
您希望 table 按行程划分,因此它看起来像:
CREATE TABLE location_by_trip (
trip_id text,
trip_timestamp timestamp,
latitude float,
longitude float,
driver text,
passenger text,
...
PRIMARY KEY (trip_id, trip_timestamp)
)
您将在特定时间检索位置:
SELECT latitude, longitude
FROM location_by_trip
WHERE trip_id = ?
AND trip_timestamp = ?
然后对于第二个应用查询:
... the location data for a given driver
table 架构看起来几乎相同,只是 table 被 driver 分区:
CREATE TABLE location_by_driver (
driver text,
trip_timestamp timestamp,
latitude float,
longitude float,
trip_id text,
passenger text,
...
PRIMARY KEY (driver, trip_timestamp)
)
并且您将使用 driver 作为 WHERE 子句中的过滤器查询 table:
SELECT latitude, longitude
FROM location_by_driver
WHERE driver = ?
AND trip_timestamp = ?
如果您愿意,ID 可以是 UUID,但这完全取决于您。但请记住,您不需要创建人工 ID 来用作分区键,因为最好始终使用“自然键”。自然键的示例是电子邮件地址、URL、fully-qualified phone 数字(包括国家/地区代码)。
如果您需要多个列来使分区键唯一,则只需要使用复合分区键。例如,电影可以共享相同的标题,因此我们通常建议添加发行年份以使其独一无二。如果您有兴趣,我已经通过 post -- https://community.datastax.com/questions/6171/.
中的示例对其进行了更详细的解释
如果您是 Cassandra 的新手,请查看 datastax.com/dev。它有很多免费的 hands-on 教程,每个教程只持续几分钟,因此您可以非常快速地学习关键概念。
Cassandra Fundamentals course is a good place to start. The Data Modeling 教程也很适合您。免费教程是交互式的,运行 在您的浏览器中,因此无需安装或配置。干杯!
我正在观看有关 Uber 使用 Cassandra 进行实时位置存储的 talk,并对分区键感到好奇。我最初的思路是有以下字段:
- ride_id
- driver_id
- 时间戳
- 纬度
- 经度
对于分区键,我介于以下之间:
- 复合主键(ride_id、driver_id)
- 主键(ride_id)
- 主键(driver_id)
查询时,我想查询给定行程的位置数据,并可能查询给定 driver 的位置数据。创建复合键有意义吗?我希望每个节点都有 ~100k 行。我是否也可以有两个单独的重复数据表但索引不同,以便我可以根据索引进行查询?
在 Uber 谈话中,他们提到他们使用 uuid(我假设与 driver 或乘车相关)和时间戳的分钟偏移量作为分区键。这是更好的方法吗?
在Cassandra数据建模中,首要的objective是为每个应用查询设计一个table。另一种表达方式是 table 和应用查询具有 one-to-one 关系:一个应用查询映射到一个 table。如果有10个app查询,需要设计10个tables.
[编辑] - 在评论中获得更多信息后更新了我的答案。
对于此应用查询:
I would want to query for the location data for a given trip
您希望 table 按行程划分,因此它看起来像:
CREATE TABLE location_by_trip (
trip_id text,
trip_timestamp timestamp,
latitude float,
longitude float,
driver text,
passenger text,
...
PRIMARY KEY (trip_id, trip_timestamp)
)
您将在特定时间检索位置:
SELECT latitude, longitude
FROM location_by_trip
WHERE trip_id = ?
AND trip_timestamp = ?
然后对于第二个应用查询:
... the location data for a given driver
table 架构看起来几乎相同,只是 table 被 driver 分区:
CREATE TABLE location_by_driver (
driver text,
trip_timestamp timestamp,
latitude float,
longitude float,
trip_id text,
passenger text,
...
PRIMARY KEY (driver, trip_timestamp)
)
并且您将使用 driver 作为 WHERE 子句中的过滤器查询 table:
SELECT latitude, longitude
FROM location_by_driver
WHERE driver = ?
AND trip_timestamp = ?
如果您愿意,ID 可以是 UUID,但这完全取决于您。但请记住,您不需要创建人工 ID 来用作分区键,因为最好始终使用“自然键”。自然键的示例是电子邮件地址、URL、fully-qualified phone 数字(包括国家/地区代码)。
如果您需要多个列来使分区键唯一,则只需要使用复合分区键。例如,电影可以共享相同的标题,因此我们通常建议添加发行年份以使其独一无二。如果您有兴趣,我已经通过 post -- https://community.datastax.com/questions/6171/.
中的示例对其进行了更详细的解释如果您是 Cassandra 的新手,请查看 datastax.com/dev。它有很多免费的 hands-on 教程,每个教程只持续几分钟,因此您可以非常快速地学习关键概念。
Cassandra Fundamentals course is a good place to start. The Data Modeling 教程也很适合您。免费教程是交互式的,运行 在您的浏览器中,因此无需安装或配置。干杯!