Cassandra COPY命令更新记录

时间:2017-06-13 08:31:09

标签: cassandra copy dataset

我想使用Cassandra COPY功能更新表格中的某些列。但是,即使找不到行,复制也会插入新记录。我想限制COPY命令,只有当找到PRIMARY KEY行时才会更新csv文件中的列。样本表和COPY命令在下面共享。

CREATE TABLE Orders(
Ord_Id      Text Primary Key,
Ord_Date    Int,
Ord_Acct    Text,
Ord_Comp_Dt Int,
Ord_Status  Text)

Sample Data:
Ord_Id | Ord_Date | Ord_Acct | Ord_Comp_Dt | Ord_Status
ORD001 | 20170602 | A001     | 20170615    | InProgress
ORD002 | 20170603 | A002     | 20170607    | Failed
ORD003 | 20170604 | A003     | 20170616    | InProgress
ORD004 | 20170605 | A003     | 20170617    | InProgress

当订单与Initial Ord_Status ='InProgress'一起放置时,上表获取行条目。基于订单完成网络提供的数据包括Ord_Id,Ord_Status。

Network Data
 ORD_ID,ORD_STATUS
 ORD001,Failed
 ORD003,Success
 ORD004,Rejected
 ORD005,DataIncomplete

下面提供了复制命令

COPY ord_schema.Orders(Ord_Id,Ord_Status) FROM 'NW170610.csv'

执行COPY命令后的表SnapShot

Sample Data:
Ord_Id | Ord_Date | Ord_Acct | Ord_Comp_Dt | Ord_Status
ORD001 | 20170602 | A001     | 20170615    | Failed
ORD002 | 20170603 | A002     | 20170607    | Failed
ORD003 | 20170604 | A003     | 20170616    | InProgress
ORD004 | 20170605 | A003     | 20170617    | Rejected
ORD005 | Null     | Null     | Null        | DataIncomplete

找不到主键时,不应插入ORD005。 在插入之前有任何方法可以检查数据是否存在,或者在数据不存在时阻止输入。

2 个答案:

答案 0 :(得分:0)

在插入复制命令之前无法检查行的存在

复制命令仅解析csv并直接插入。因此,您必须编写自己的代码来阅读csv NW170610,并使用select查询检查每个记录是否存在,如果存在则插入。

使用copy to command

转储Orders表的csv
COPY orders (ord_id) TO 'orders_id.csv';

现在,对于NW170610的每条记录,检查orders_id.csv中的ID是否存在,如果是,则将记录写入另一个文件complete_order.csv

现在只需使用命令

中的副本加载complete_order.csv文件

答案 1 :(得分:0)

Cassandra做了一个UPSERT。这意味着,如果没有列(基于主键),它将插入一列。

我建议添加另一列Ord_Acct(可以带来数据唯一性的东西)作为集群/复合键。现在,如果Ord_Acct为null,则不会执行插入操作。因此,总结一下,我建议更改符合您要求的数据模型。