UUID Кассандра - PullRequest
       7

UUID Кассандра

3 голосов
/ 18 мая 2010

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 14 июня 2011

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

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

Этот класс позволяет легко создавать UUID типа 1 и извлекать временные метки по мере необходимости. См. Связанный тестовый пример для примеров.

Гектор имеет лицензию MIT, поэтому, если вы настроены заниматься своим делом, не стесняйтесь использовать любую помощь.

3 голосов
/ 18 мая 2010

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

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 голосов
/ 19 мая 2010

Я просто продолжаю там, где остановился "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 в зависимости от требования.

1 голос
/ 19 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...