我正在使用CqlStorage
将一些来自Cassandra的简单数据加载到Pig中。 CqlStorage
加载器定义了一个基于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
时,Pig抱怨索引超出范围。 (奇怪的是,flattened
认为它与原始data
具有相同的架构。)
不知何故,CqlStorage
似乎生成了错误的架构,并且该架构仍然存在于原始集合的投影中。有什么方法可以解决这个问题吗?
(我正在使用Cassandra 1.2.8和Pig 0.11.1)
答案 0 :(得分:1)
通过在CCE: BinSedesTuple cannot be cast to String中应用修补程序,https://issues.apache.org/jira/browse/CASSANDRA-5867已解决此问题。
正如Alex Lui在我的机票中提到的那样:
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