2017-06-13 80 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