假设我有一个像这样的表:
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
的索引表,但它也不起作用。我可以查询索引集合吗?我该怎么做?
最佳答案
似乎 CONTAINS 子句只适用于每个语句一个值,因此您可能无法一次性将两个不同的 CONTAINS 子句“与”在一起。
因此,我将使用 CONTAINS 'book1' 创建一个 RDD,然后使用 CONTAINS 'book2' 创建另一个 RDD,然后在 userid 字段上对两个 RDD 进行联接。这将为您提供在其图书集中同时拥有 book1 和 book2 的用户的结果 RDD。
关于java - Spark SQL - 集合(集)上的 Cassandra SqlContext 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776378/