从cassandra DB检索所有行的有效方法

时间:2018-03-08 21:26:31

标签: java cassandra cassandra-3.0 datastax-java-driver

我在cassandra中有一张表,其定义如下

CREATE TABLE IF NOT EXISTS PRODUCT_INV (
Product_Code TEXT,
Storecode TEXT,
StoreType TEXT,
ProductInfo TEXT,
PRIMARY KEY ((Product_Code, Storecode, StoreType)));

现在我想获取特定于Storecode和StoreType的所有Product_Code的列表。 做同样事情的最有效方法是什么。该表可以包含大量记录。

例如:

Product_Code    Storecode   StoreType   ProductInfo
12  601 Retail      ABC
12  601 Supermart   ABC
13  601 Retail  DEF
14  701 Retail  QWE
13  601 Supermart   ZXC

结果应为:

Storecode: 601
StoreType: Retail
List of Product_Code : 12,13

Storecode: 601
StoreType : Supermart
List of Product_Code : 12,13

Storecode: 701
StoreType: Retail
List of Product_Code:14

1 个答案:

答案 0 :(得分:3)

Cassandra数据建模完全是关于非规范化的。如果有疑问,非规范化通常是最有效的方法。

在这种情况下,如果您创建下表:

CREATE TABLE IF NOT EXISTS product_codes_by_store (
product_code TEXT,
storecode TEXT,
store_type TEXT
PRIMARY KEY ((storecode, store_type), product_code));

现在,您可以进行此查询以获取所有产品代码:

SELECT * FROM product_codes_by_store WHERE storecode = 'aaa' AND store_type = 'bbb';

此方法非常有效,因为Cassandra只需要命中一个分区(因此只需一个节点)即可完成查询。

但是,您需要记住以下几点:

  1. 如果会有大量结果,您可能需要进行分页,以便查询不会超时。以下是有关如何执行此操作的Java驱动程序的文档:https://docs.datastax.com/en/developer/java-driver/3.1/manual/paging/
  2. 由于我在此处添加了一个群集列(product_code),因此您需要确保(storecode, store_type)定义的分区不会太大。建议您尽可能将分区保持在100MB以下,因为非常大的分区可能会导致性能问题。虽然这里有一点余地 - 如果你有点超过100MB,那也不算太糟糕,特别是对于较大版本的Cassandra而言,它们可以更好地支持大型分区(见https://issues.apache.org/jira/browse/CASSANDRA-11206)。
相关问题