我正在使用 Cassandra 将一些简单的数据加载到 Pig 中CqlStorage
。loader 定义了一个基于 Cassandra schema的CqlStorage
schema,但似乎是错误的。
如果我做:
data = LOAD 'cql://bookdata/books' USING CqlStorage();
DESCRIBE data;
我明白了:
data: {isbn: chararray,bookauthor: chararray,booktitle: chararray,publisher: chararray,yearofpublication: int}
但是,如果 I 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,
...
一旦我尝试访问 field $5
,Pig 就会抱怨索引超出范围。(奇怪的是,flattened
认为它与原始的架构相同data
。)
不知何故,CqlStorage
似乎生成了错误的模式,并且该模式持续存在于原始集合的投影中。有没有办法解决这个问题?
(我使用的是 Cassandra 1.2.8 和 Pig 0.11.1)