Как ФИЛЬТРОВАТЬ Cassandra TimeUUID/UUID в Pig

Вот моя схема Cassandra, использующая Datastax Enterprise.

CREATE KEYSPACE applications
  WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};

USE applications;

CREATE TABLE events(
  bucket text, 
  id timeuuid,
  app_id uuid,  
  event text, 
  PRIMARY KEY(bucket, id)
);

Я хочу ФИЛЬТР в PIG по app_id (TimeUUID) и id (UUID), вот мой скрипт Pig.

events = LOAD 'cql://applications/events'
  USING CqlStorage()
  AS (bucket: chararray, id: chararray, app_id: chararray, event: chararray);

result = FOREACH events GENERATE bucket, id, app_id;
DESCRIBE result;
DUMP result;

Вот результат

result: {bucket: chararray,id: chararray,app_id: chararray}
(2014-02-28-04,?O]??4??p??M?,;??F? (|?Mb) \n
(2014-02-28-04,?O??4??p??M?,?h^@?E????)
(2014-02-28-04,?V???4??p??M?,;??F? (|?Mb)
(2014-02-28-04,?W?0?4??p??M?,?h^@?E????)
(2014-02-28-04,?X^p?4??p??M?,?h^@?E????)

Обратите внимание, что поля app_id и id являются двоичными, и мне нужно отфильтровать по некоторому UUID, какие-либо предложения?


person cevaris    schedule 03.03.2014    source источник


Ответы (2)


Вам нужно использовать UDF для преобразования двоичных байтов UUID/TimeUUID в chararray. Не пытайтесь определить его как chararray напрямую, как AS (bucket: chararray, id: chararray, app_id: chararray, event: chararray);

Или вы можете использовать https://github.com/cevaris/pig-dse/blob/master/src/main/java/com/dse/pig/udfs/AbstractCassandraStorage.java, которые преобразуют UUID/TimeUUID в строку

Подайте билет Cassandra, если вы считаете, что по умолчанию можно преобразовать UUID в строку.

person alexliu68    schedule 14.03.2014
comment
Да, ты прав. Следующая проблема, с которой я столкнулся, — это попытка сохранить преобразованный String UUID/TimeUUID обратно в тип UUID/TimeUUID. Поскольку я использовал CQL3 в Cassandra, была проверка типа, и ей не нравилась версия UUID/TimeUUID для chararray. Я предполагаю, что мне придется проанализировать каждый chararray, чтобы увидеть, является ли он UUID/TimeUUID, и преобразовать его обратно перед сохранением. Я просто отказался от всех сравнений UUID в Pig и пошел дальше. - person cevaris; 15.03.2014

Удалось решить с помощью пользовательской версии CQLStorage UDF Pig Loader. Проблема заключалась в том, что загрузчики Cassandra CQLStorage/CassandraStorage Pig не знают, как обрабатывать типы UUID/TimeUUID. Я предполагаю, что это происходит для большинства нестандартных типов данных. В любом случае, вот ссылка на закодированное решение на github.

https://github.com/cevaris/pig-dse

person cevaris    schedule 04.03.2014