2017-06-13 18 views
0

Cassandra COPY機能を使用してテーブルの特定の列を更新したいとします。しかし、行が見つからなくてもCopyは新しいレコードを挿入します。私は、PRIMARY KEY行が更新されるcsvファイルの列が見つかった場合にのみ、COPYコマンドで制限したいと思います。サンプルテーブルと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コマンドを実行した後

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

表スナップショットの下に設けられています。 データが存在しないときに挿入または挿入を防止する前に、データが存在するかどうかを確認する方法はありますか。

答えて

0

それだけでcsvファイルを解析し、直接挿入するコピーコマンド

COPYコマンドを使用して挿入する前に、行の有無をチェックすることはできません。だからあなたはcsv NW170610を読むために独自のコードを書く必要があります。

YESまたは、別のファイルcomplete_order.csvにレコードを書き込む場合、orders_id.csvのid存在することをNW170610チェックの各レコードのための今すぐ

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

を指令するコピーを使用してOrdersテーブルのcsvファイルをダンプします。

は今だけ

+0

ありがとうございます。時間は解決策がうまく動作します。 – lakksv

0

カサンドラはUPSERTを行うコマンドからのコピーを使用してcomplete_order.csvファイルをロードします。つまり、(プライマリキーに基づいて)カラムがない場合は、カラムが挿入されます。私がお勧めしたい何

は、クラスタリング/複合キーとして別の列多分Ord_Acct(データに一意性をもたらすことができるもの)を追加することです。 Ord_Acctがnullの場合、挿入は行われません。要約すると、お客様の要件を満たすデータモデルを変更することをお勧めします。

+0

ありがとうございます。バルクオーダ注文を挿入する他のアプリケーションもあります。主キーの組み合わせを変更することは大きな影響を与えます。 – lakksv

関連する問題