UUID Кассандра

Я новичок в Кассандре. Я пытаюсь вставить некоторые значения в семейство столбцов. Определение семейства столбцов в файле конфигурации выглядит следующим образом.

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

Когда я когда-либо пытаюсь вставить значения, я всегда получаю «InvalidRequestException (почему: UUID должны быть ровно 16 байтов)».

Я использую batch_mutate() для вставки столбца.

Как я могу вставить значения в семейство столбцов.


person Sandeep    schedule 18.05.2010    source источник


Ответы (4)


Ниже приведен фрагмент кода (из Ника Берарди). Журнал кодера)

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);
    }
person Schildmeijer    schedule 18.05.2010

«У нас есть API для этого» :-)

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

Этот класс упрощает создание UUID типа 1 и извлечение временных меток по мере необходимости. Примеры см. в соответствующем тестовом примере.

Гектор имеет лицензию Массачусетского технологического института, поэтому, если вы настроены заниматься своими делами, не стесняйтесь использовать все, что вам поможет.

person zznate    schedule 14.06.2011

Я просто продолжаю там, где остановился «Schildmejir». Вот как вы можете фактически использовать сгенерированный 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 });

Вы можете использовать сгенерированный GUID либо в SupercolumnName, либо в columnName в зависимости от требований.

person Sandeep    schedule 19.05.2010

Cassandra ожидает, что UUID будут соответствовать RFC 4122, поэтому вам нужно либо самостоятельно сгенерировать соответствующие значения или используйте существующую библиотеку для выбранного вами языка (большинство языков имеют легкодоступные бесплатные библиотеки генерации UUID).

person Nick Bastin    schedule 19.05.2010