2010-05-18 80 views
3

我是Cassandra的新手。我正在嘗試將一些值插入到columnfamily中。配置文件中columnfamily的定義如下。UUID Cassandra

<ColumnFamily Name="CommandQueue" 
        ColumnType="Super" 
        CompareWith="TimeUUIDType" 
        CompareSubcolumnsWith="UTF8Type"/> 

當我試圖插入值時,我總是得到「InvalidRequestException(爲什麼:UUID必須正好是16字節)」。

我正在使用batch_mutate()來插入列。

如何將值插入列系列。

回答

3

下面的代碼片段(來自Nick Berardi's Coder Journal

public static Guid GenerateTimeBasedGuid(DateTime dateTime) 
    { 
     long ticks = dateTime.Ticks - GregorianCalendarStart.Ticks; 

     byte[] guid = new byte[ByteArraySize]; 
     byte[] clockSequenceBytes = BitConverter.GetBytes(Convert.ToInt16(Environment.TickCount 
      % Int16.MaxValue)); 
     byte[] timestamp = BitConverter.GetBytes(ticks); 

     // copy node 
     Array.Copy(Node, 0, guid, NodeByte, Node.Length); 

     // copy clock sequence 
     Array.Copy(clockSequenceBytes, 0, guid, GuidClockSequenceByte,clockSequenceBytes.Length); 

     // copy timestamp 
     Array.Copy(timestamp, 0, guid, 0, timestamp.Length); 

     // set the variant 
     guid[VariantByte] &= (byte)VariantByteMask; 
     guid[VariantByte] |= (byte)VariantByteShift; 

     // set the version 
     guid[VersionByte] &= (byte)VersionByteMask; 
     guid[VersionByte] |= (byte)((int)GuidVersion.TimeBased << VersionByteShift); 

     return new Guid(guid); 
    } 
1

卡桑德拉預計的UUID符合RFC 4122,所以你要麼需要生成符合自己的價值觀或使用現有的庫您所選擇的語言(大多數語言都有免費的UUID生成庫)。

2

我只是繼續在「Schildmejir」已停止。這就是您如何實際使用生成的GUID將值插入到columnfamilies中。

Mutation foobar = new Mutation() 
{ 
    Column_or_supercolumn = new ColumnOrSuperColumn() 
     { Super_column = new SuperColumn() 
     { Name = GuidGenerator.GenerateTimeBasedGuid(DateTime.Now).ToByteArray(), 
       Columns = listOfSomeColumns 
      } 
     } 
}; 

List<Column> foobarlist = new List<Column>(); 
listOfChannelIds.Add(new Column() { Name = utf8Encoding.GetBytes("somename"), Value = utf8Encoding.GetBytes(somestring), Timestamp = timeStamp }); 

根據需要,您可以在SupercolumnName或columnName中使用生成的GUID。