Cassandra DB - 子列查询

时间:2015-11-30 10:22:07

标签: cassandra data-modeling cql

我是Cassandra db的新手并尝试从下表中查询子列First Name但是失败了。我能够查询直接列名称,但不能查询其下的子列名称。

CALLER INFO表格结构如下

1. Unique ID
2. CustomerInfo
        {First Name,
        Middle Name,
        Last Name,
        Date of Birth,
        Sex}

请让我知道查询以检索名字,DOB等的详细信息。

1 个答案:

答案 0 :(得分:1)

直接回答您的问题,Cassandra 2.1 docs have an example为此。根据您提供的信息,我将创建用户定义类型(UDT):

 aploetz@cqlsh:stackoverflow> CREATE TYPE info (
             ... firstName TEXT,
             ... middleName TEXT,
             ... lastName TEXT,
             ... dob TEXT,
             ... sex TEXT);

然后我将创建一个名为callerInfo的表:

aploetz@cqlsh:stackoverflow> CREATE TABLE callerInfo (
             ... customerID UUID,
             ... customerInfo frozen<info>,
             ... PRIMARY KEY customerID);

接下来,我将在customerInfo

上创建二级索引
aploetz@cqlsh:stackoverflow> CREATE INDEX cinfo_idx ON callerInfo (customerInfo);

现在我尝试仅在lastName上查询:

aploetz@cqlsh:stackoverflow> SELECT * FROM callerInfo WHERE customerInfo={lastName:'Scott'};

(0 rows)

为什么不起作用?因为在UDT上使用二级索引的当前实现,我必须为所有组件指定条件。

aploetz@cqlsh:stackoverflow> SELECT * FROM callerInfo WHERE 
    customerInfo={firstName:'Michael', middlename:'Gary', lastname:'Scott', dob:'1964/03/15', sex:'M'};

 customerid                           | customerinfo
--------------------------------------+--------------------------------------------------------------------------------------------
 f1dea08f-5870-402d-82e1-ee9e215e0294 | {firstname: 'Michael', middlename: 'Gary', lastname: 'Scott', dob: '1964/03/15', sex: 'M'}

(1 rows)

因此可能(或可能不)适用于您的用例。老实说,我会使用这种方法有两个原因。

  1. 已知二级索引在大规模上表现不佳......以及非集合/ UDT列的表现。我只能想象UDT上的二级索引会表现得更差。
  2. 你可以非常在Cassandra 中轻松建模,而不必使用UDT或二级索引。
  3. 由于您确定需要按姓氏查询客户,因此我会设计一个专门用于该查询的表格:

    CREATE TABLE callerInfoByLastName (
      lastName TEXT,
      firstName TEXT,
      middleName TEXT,
      customerID UUID,
      dob TEXT,
      sex TEXT,
      PRIMARY KEY ((lastName),firstName,middleName,customerID));
    

    现在,您可以lastName进行查询,并按firstNamemiddleName(每个lastName内)排序您的数据。 customerID被添加到PK中以确保唯一性(如果您需要具有相同名称的不同人员)。对于出生日期(dob),我会创建一个新的类似查询表,并在那里复制您的数据。