CqlStorage генерирует неправильную схему Pig
Я загружаю некоторые простые данные из Кассандры в Свинью, используя CqlStorage
, CqlStorage
loader определяет схему на основе схемы Cassandra, но, похоже, это неправильно.
Если я сделаю:
data = LOAD 'cql://bookdata/books' USING CqlStorage();
DESCRIBE data;
Я получаю это:
data: {isbn: chararray,bookauthor: chararray,booktitle: chararray,publisher: chararray,yearofpublication: int}
Однако если я DUMP
data
Я получаю результаты, подобные этим:
((isbn,0425093387),(bookauthor,Georgette Heyer),(booktitle,Death in the Stocks),(publisher,Berkley Pub Group),(yearofpublication,1986))
Очевидно, что результаты Cassandra - это пары ключ / значение, как и следовало ожидать. Я не знаю, почему схема генерируется CqlStorage()
было бы так по-другому.
Это действительно вызывает у меня проблемы при попытке получить доступ к значениям столбца. Я попробовал наивный подход FLATTEN
в каждом кортеже, а затем пытаемся получить доступ к значениям таким образом:
flattened = FOREACH data GENERATE
FLATTEN(isbn),
FLATTEN(booktitle),
...
values = FOREACH flattened GENERATE
$1 AS ISBN,
$3 AS BookTitle,
...
Как только я пытаюсь получить доступ к полю $5
Свинья жалуется на то, что индекс вышел за пределы. (Любопытно, flattened
считает, что имеет ту же схему, что и оригинал data
.)
Так или иначе, CqlStorage
кажется, генерирует неправильную схему, и эта схема сохраняется в проекциях исходной коллекции. Есть ли способ обойти это?
(Я использую Cassandra 1.2.8 и Pig 0.11.1)
1 ответ
Это было решено для CCE: BinSedesTuple нельзя привести к String, применив исправление в https://issues.apache.org/jira/browse/CASSANDRA-5867.
Как Алекс Луи упомянул в своем билете:
git clone http://git-wip-us.apache.org/repos/asf/cassandra.git
cd cassandra
git checkout cassandra-1.2
patch -p1 < 5867-bug-fix-filter-push-down-1.2-branch.txt
ant