【问题标题】:SparkSQL - CassandraSqlContext query on Collection (Set)Spark SQL - 集合上的 Cassandra SqlContext 查询(集)
【发布时间】:2015-03-02 19:18:56
【问题描述】:

假设我有一张这样的桌子:

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

【问题讨论】:

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


    【解决方案1】:

    似乎 CONTAINS 子句每条语句只能使用一个值,因此您可能无法一次将两个不同的 CONTAINS 子句“和”在一起。

    所以我会使用 CONTAINS 'book1' 创建一个 RDD,然后我会使用 CONTAINS 'book2' 创建另一个 RDD,然后我会在 userid 字段上连接两个 RDD。这应该会为您提供图书集中同时具有 book1 和 book2 的用户的 RDD。

    【讨论】:

    • 这就是我现在正在做的,但它有点慢。我知道使用 cql 是不可能的,但我希望使用带有一些 join 子句的 sql 上下文来做到这一点。
    • 嗨@MustafaGenç..我有类似的问题..有了这个我得到GenericRow而不是CassandraRow..使用schemaRDD临时表进行JOIN。
    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 2018-10-31
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2015-08-09
    • 2019-06-20
    相关资源
    最近更新 更多