2011-07-31 13 views
1

Crawled = 0の状態のCassandraに初期データ(クローラのURLリスト)をロードしています。その後、Hadoopを使用してすべてのリンクをクロールし、0から何か他のもの、たとえば1または2、または3に変更しようとします.Cassandra cliインターフェイスをチェックインすると、ColumnFamily ['www.somedomain.com']の値がクローラ列は同じままです。最初のインポート中にクロールされた列について言及していない場合は、正しく追加されます。これはアルゴリズムの一部に過ぎず、他のMap/Reduceジョブなどでこの列をさらに更新する必要があります。なぜ突然変異は既存の列に挿入を行いません

ThriftとCassandra APIでは、挿入と削除のみがあると言われています。 Insertはアップデートとして機能するはずです。

クロールされた列については、私はUTF8タイプを持っています。

変異クラスは、このようなものです:

private static Mutation getMutationCrawled(Text crawledVal) 
    { 
     Text column = new Text(); 
     column.set("crawled"); 

     Column c = new Column(); 

     c.setName(ByteBuffer.wrap(Arrays.copyOf(column.getBytes(), column.getLength()))); 
     c.setValue(ByteBuffer.wrap(crawledVal.getBytes())); 
     c.setTimestamp(System.currentTimeMillis()); 

     Mutation m = new Mutation(); 
     m.setColumn_or_supercolumn(new ColumnOrSuperColumn()); 
     m.column_or_supercolumn.setColumn(c); 

     return m; 
    } 

答えて

2

カサンドラは最大のタイムスタンプが勝つと、突然変異のタイムスタンプを使用して競合を解決します。タイムスタンプ値は任意の値に設定できますが、タイムスタンプをマイクロ秒単位の値として設定するのが一般的です。上記の例では、あなたとタイムスタンプを設定し、

c.setTimestamp(System.currentTimeMillis()); 

は、ほとんどの値を移入する最初のインポートコードは、マイクロ秒単位のタイムスタンプを設定しています。マイクロ秒のタイムスタンプ値はミリ秒のタイムスタンプ値よりも大きいため、更新は無視されます。

+0

ありがとうございます!問題はまさにこのようでした – Anton

関連する問題