我想使用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。 在插入之前有任何方法可以检查数据是否存在,或者在数据不存在时阻止输入。
答案 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,则不会执行插入操作。因此,总结一下,我建议更改符合您要求的数据模型。