据我所知,由于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文件中的数据加载到我创建的表中?我首先从订单文件插入数据,它工作正常。当我插入项目时,它会抛出错误说错过主键。
知道如何将不同输入文件中的数据插入到非规范化表中吗?感谢。
答案 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。