将数据加载到Cassandra非规范化表中

时间:2016-10-01 07:14:26

标签: cassandra denormalization

据我所知,由于Cassandra不支持join,我们有时需要创建非规范化表。 鉴于我需要为给定订单ID的订单中的每个项目获取项目名称,我使用:

创建一个表格
CREATE TABLE order (
  order_id int,
  item_id int,
  item_name,
  primary key ((id), item_id)
);

我有两个csv文件来加载来自order.csv和item.csv的数据,其中order.csv包含order_id和item_id,item.csv包含item_id和item_name。

问题是如何将csv文件中的数据加载到我创建的表中?我首先从订单文件插入数据,它工作正常。当我插入项目时,它会抛出错误说错过主键。

知道如何将不同输入文件中的数据插入到非规范化表中吗?感谢。

2 个答案:

答案 0 :(得分:0)

主键的定义有拼写错误,应该是

CREATE TABLE order (
  order_id int,
  item_id int,
  item_name,
  primary key (order_id, item_id)
);

您是否使用COPY上传数据?

关于非规范化,这取决于您的用例,通常在规范化模式上,您将有一个表用于订单,另一个用于客户,并使用SQL连接以同时显示订单和客户的信息;在这种情况下,对于非规范化表,您将在同一个表中包含订单和客户信息,这些字段将取决于您将如何使用查询。

根据经验,在创建表格之前,首先需要定义要使用的内容。

答案 1 :(得分:0)

item_id上使用辅助索引应该可以解决问题:

CREATE INDEX idx_item_id ON order (item_id);

现在您应该可以查询:

SELECT * FROM order WHERE item_id = ?;

请注意索引通常会对性能产生影响,因此您可以使用它们导入数据,并在完成后删除它们。

有关详细信息,请参阅Cassandra Index Documentation