2017-06-13 82 views
0

我想使用Cassandra COPY功能更新表中的某些列。但即使未找到行,Copy也会插入新记录。我想限制在COPY命令中,只有当PRIMARY KEY行被找到时,csv文件中的列才会被更新。示例表和COPY命令在下面共享。Cassandra 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 

上面的表获取行条目时,订单放置与初始Ord_Status ='InProgress'。根据订单完成网络提供的数据与Ord_Id,Ord_Status。当没有找到主键

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

复制命令正在执行COPY命令

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之后提供下面

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

表的SnapShot不应被插入。 请在数据不存在的情况下,在插入或阻止输入之前,有任何方法检查数据是否存在。

回答

0

这是不可能的复制命令插入

复制命令只解析CSV和直接插入前检查行的存在。所以你必须编写你自己的代码来读取csv NW170610,并为每个记录检查存在与选择查询,如果存在然后插入。

或者倾倒的Orders表使用复制CSV指挥

COPY orders (ord_id) TO 'orders_id.csv'; 

现在对于NW170610检查存在于orders_id.csv的ID,如果是,那么写入记录到另一个文件complete_order.csv的每个记录。

现在只需从命令

+0

谢谢。时间是解决方案正常工作。 – lakksv

0

卡桑德拉做一个UPSERT加载使用拷贝complete_order.csv文件。这意味着,如果没有(基于主键)它将插入一列。

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

+0

谢谢。还有其他应用程序以及插入批量订单。改变主键组合将产生巨大的影响。 – lakksv