我是Cassandra的新手。我试图将一些值插入columnfamily。配置文件中columnfamily的定义如下。
<ColumnFamily Name="CommandQueue"
ColumnType="Super"
CompareWith="TimeUUIDType"
CompareSubcolumnsWith="UTF8Type"/>
当我尝试插入值时,我总是得到“InvalidRequestException(为什么:UUID必须正好是16个字节)”。
我正在使用batch_mutate()来插入列。
如何将值插入列族。
答案 0 :(得分:5)
“我们有一个API”: - )
此类可以轻松构建type1 UUID并根据需要提取时间戳。有关示例,请参阅相关的测试用例。
赫克托耳是麻省理工学院的许可证,所以如果你打算做自己的事情,请随意使用任何帮助。
答案 1 :(得分: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);
}
答案 2 :(得分:2)
我正在继续“Schildmejir”停止的地方。这是如何在将值插入columnfamilies时实际使用生成的GUID。
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。
答案 3 :(得分:1)
Cassandra希望UUID符合RFC 4122,因此您需要自己生成合规值或使用现有库作为您选择的语言(大多数语言都有免费的UUID生成库)。 / p>