Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的示例用例的Cassandra设计方法_Cassandra - Fatal编程技术网

我的示例用例的Cassandra设计方法

我的示例用例的Cassandra设计方法,cassandra,Cassandra,我从过去的几天里学习卡桑德拉。尝试为以下用例创建数据模型 "Each Zipcode in US has a list of stores sorted based on a defined rank" "Each store/warehouse has millions of SKUs and the inventory is tracked" "If I search using a zipcode and SKU, it should return the best possible 10

我从过去的几天里学习卡桑德拉。尝试为以下用例创建数据模型

"Each Zipcode in US has a list of stores sorted based on a defined rank"
"Each store/warehouse has millions of SKUs and the inventory is tracked"
"If I search using a zipcode and SKU, it should return the best possible 100 stores 
with inventory, based on the rank"

Assume store count is 1000+ and sku count is in millions
设计尝试

One table with 
ZipCode
Rank
StoreID
primary key (ZipCode, Rank)

Another table with

Sku
Store
Inventory
Primary Key (Sku, Store)
现在,如果我想搜索每个ZipCode的前100家商店,SKU 组合

我必须在表1中搜索前100家商店和 然后从第二个表中提取每个商店的库存

由于SKU数量以百万为单位,而门店数量以1000+为单位,因此m不是 当然,如果我们可以将所有这些存储在一个表中,并将zipcode_sku作为行 密钥和存储和库存存储为按等级排序的宽行

我想得对吗?此用例的其他可能数据模型是什么?


更新:数据加载程序代码(如以下注释所述)


听起来您希望从第一个表中基于ZipCode获取StoreID列表,从第二个表中基于Sku获取StoreID列表,然后执行联接。因为Cassandra是一个简单的键值存储,所以它不做join。因此,您必须在客户端编写代码来执行这两个查询并手动执行联接,或者将Cassandra连接到具有联接功能的spark

正如您所说,尝试将两个表反规范化为一个表,以便您可以这样做,因为一个查询可能会导致一个非常大且难以维护的表。如果这是您将拥有的唯一查询模式,那么这可能是值得的,但是如果这是一个具有许多不同查询模式的通用库存系统,那么它可能太不灵活


另一种选择是使用RDBMS而不是Cassandra,然后连接就非常容易了。

Cassandra是一个列式数据库,因此您可以拥有宽行,通常用于表示要进行的每种查询。在这种情况下

CREATE TABLE storeByZipcodeAndSku (
  sku text,
  zipcode int,
  store text,
  store_rank int,
  inventory int,
  PRIMARY KEY ((sku, zipcode), store)
);
这样,行键是sku+zipcode,因此它是一个非常快速的查找,您可以在其中存储多达20亿个存储。更新库存时,也要更新此表。要想获得前100名,你只需把所有的人都拉下来进行排序(1000人并不多),但如果这个操作非常常见,而且你需要更快,你可以使用它

CREATE TABLE rankedStoreByZipcodeAndSku (
  ...
  PRIMARY KEY ((sku, zipcode), store_rank)
) WITH CLUSTERING ORDER BY (store_rank ASC);

让它自动为您排序,您只需抓取前100名。然后,当您更新它时,您将希望使用轻量级事务以原子方式移动内容。

谢谢Chris。。我编写了一个示例代码并将数据加载到表中。我使用的样本有100个SKU、100个Zipcode和200个存储区。它创建了2000000行。搜索速度极快,结果已返回..了解专家如何处理这些用例.更正。。1000个随机调用的平均搜索量为1.7 mills,最大搜索量为6 mils。分区数将为SKU*ZIP数。分区可以安全地拥有大量的节点,它们将随着节点的数量线性扩展。如果要解决很多问题,可以添加节点来解决问题。分区中的最大行数实际上是StoreByZipCode和SKU中的存储数量,或者是RankedStoreByZipCode和SKU中的列数,尽管从经验上看,它不会接近那么糟糕。这就是你的20亿限制,在商店或等级的数量上。Chris,我只是想确保我理解-分区的数量(sku*zip),我在“表”中看到的“行”是1000000 X 42000=42000000000(420亿)。这些键(或行)中的每一个都将有1500(存储)宽。在一开始插入这些数据要花很多时间,对吗?我编写了一个简单的数据加载器,甚至完成1个sku都需要花费很长时间。可能这不是正确的插入方式,甚至不是正确的测量方式(我笔记本电脑中的一个虚拟机)。但我还是在看这些书,然后说“嗯”。。(问题中更新了加载程序代码)不知道为什么会被否决。Cassandra是开源的,在所有的网络研讨会上都有一个关于开发人员社区帮助他人提升的大讨论。这似乎是唯一可以对卡桑德拉提出质疑的论坛。在我发布这个问题之前,我进行了大量的研究、编码和实验。我试过一张桌子的方法。。看到大量的数据,我认为有另一种方法,这个问题已经发布了。不确定在此论坛上提问的标准是什么:(
CREATE TABLE rankedStoreByZipcodeAndSku (
  ...
  PRIMARY KEY ((sku, zipcode), store_rank)
) WITH CLUSTERING ORDER BY (store_rank ASC);