0

我是 Cassandra 的新手,并在 youtube 上关注这个Cassandra 教程。在本教程中,作者创建了两个表,如下所示:

create table children(childid varchar, firstname varchar, lastname varchar, country varchar, state varchar, zip varchar, primary key(child)) with compact storage;

create table naughtyornicelist(standingbycountry varchar, state varchar, zip varchar, childid varchar, primary key(standingbycountry, state, zip, childid));

我现在面临两个问题。

第一个问题是children只有在我删除时才会创建表with compact storage

第二个问题是,在创建naughtyornicelist表时,Cassandra 抛出以下错误:Bad Request: No definition found that is not part of the PRIMARY KEY

我给出了以下命令

cqlsh:northpole> create table naughtyornicelist(standingbycountry varchar, state varchar, zip varchar, childid varchar, primary key(standingbycountry, state, zip, childid));
Bad Request: No definition found that is not part of the PRIMARY KEY
cqlsh:northpole>

我无法找到此错误出现的原因以及如何解决此错误。请求 Cassandra 人员提供帮助。

4

1 回答 1

2

无论是否紧凑存储,孩子在创建过程中都应该失败,您的主键未定义:

create table northpole.children(
  childid varchar,         <---- column name = childid
  firstname varchar, 
  lastname varchar, 
  country varchar, 
  state varchar, 
  zip varchar, 
  primary key(child)       <---- column name = child != childid
) with compact storage;

未找到不属于 PRIMARY KEY 的定义

您正在创建一个列族(cql 表),它使用主键中的每一列(cql talk)。你不能那样做。如果您希望能够在WHERE子句中使用列,请考虑二级索引

create table northpole.naughtyornicelist (
  standingbycountry varchar, 
  state varchar, 
  zip varchar, 
  childid varchar, 
  PRIMARY KEY(childid, standingbycountry)
);

CREATE INDEX inex_name ON northpole.naughtyornicelist (zip);
CREATE INDEX inex_name ON northpole.naughtyornicelist (state);

您拥有的主键非常重要,因为它决定了数据的分布和聚类。键的第一部分(在本例中为 childid)称为分区键,用于在不同节点之间分配数据,因此您希望分区键尽可能随机。其余字段构成集群键用于排序,以便查询具有相同聚类键的列可以更有效。 请注意,这是一个粗略的指南,我不知道您将如何查询,但您必须相应地调整您的架构。

于 2013-08-28T11:55:41.343 回答