UUID Cassandra

时间:2010-05-18 19:50:52

标签: cassandra

我是Cassandra的新手。我试图将一些值插入columnfamily。配置文件中columnfamily的定义如下。

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

当我尝试插入值时,我总是得到“InvalidRequestException(为什么:UUID必须正好是16个字节)”。

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

如何将值插入列族。

4 个答案:

答案 0 :(得分:5)

“我们有一个API”: - )

https://github.com/rantav/hector/blob/master/core/src/main/java/me/prettyprint/cassandra/utils/TimeUUIDUtils.java

此类可以轻松构建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>