假设我有一张表:
CREATE TABLE USER (
userid ascii,
books set<text>
PRIMARY KEY (userid)
);
和索引:
create index on USER (books);
我想通过使用sql上下文查询书籍。我在做的是:
CassandraSQLContext cassandraContext = new CassandraSQLContext(sparkContext);
SchemaRDD userTable = cassandraContext.sql("SELECT * FROM keyspace.user");
userTable.registerTempTable("usertable");
以下查询不适用于Cassandra:
SchemaRDD userTable = cassandraContext.sql("SELECT * FROM keyspace.user where books CONTAINS 'book1' and books CONTAINS 'book2'");
它只返回'book1'的用户。我尝试过像books CONTAINS ('book1', 'book2')
这样的类似查询,但都没有。
我在注册表上可以做的是:
SchemaRDD users = cassandraContext.sql("SELECT * FROM usertable where userid='some_user_id'");
我想做的是通过以下书籍查询:
SchemaRDD users = cassandraContext.sql("SELECT * FROM usertable where books IN ('book1', 'book2')");
或类似的查询。
但它不起作用。它返回0条记录。我尝试注册名为user_books_idx
的索引表,但它也没有用。我可以查询索引集合吗?我该怎么做?
答案 0 :(得分:1)
似乎CONTAINS子句仅对每个语句使用一个值,因此您可能无法一次'和'两个不同的CONTAINS子句一起使用。
所以我会使用CONTAINS'book1'创建一个RDD,然后我使用CONTAINS'book2'创建另一个RDD,然后我会在userid字段上连接两个RDD。这应该会为你的书籍集中的book1和book2提供结果的RDD。