SparkSQL - 关于Collection(Set)的CassandraSqlContext查询

时间:2015-01-05 09:15:07

标签: java cassandra apache-spark apache-spark-sql

假设我有一张表:

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的索引表,但它也没有用。我可以查询索引集合吗?我该怎么做?

1 个答案:

答案 0 :(得分:1)

似乎CONTAINS子句仅对每个语句使用一个值,因此您可能无法一次'和'两个不同的CONTAINS子句一起使用。

所以我会使用CONTAINS'book1'创建一个RDD,然后我使用CONTAINS'book2'创建另一个RDD,然后我会在userid字段上连接两个RDD。这应该会为你的书籍集中的book1和book2提供结果的RDD。