1

次のようなテーブルがあるとしましょう:

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 レコードを返します。asという名前のインデックステーブルを登録しようとしましuser_books_idxたが、うまくいきませんでした。インデックス付きコレクションに対してクエリを実行できますか? どうすればできますか?

4

1 に答える 1

1

CONTAINS 句はステートメントごとに 1 つの値でしか機能しないようです。そのため、2 つの異なる CONTAINS 句を一度に「AND」できない場合があります。

したがって、CONTAINS 'book1' を使用して 1 つの RDD を作成し、次に CONTAINS 'book2' を使用して別の RDD を作成し、次に userid フィールドで 2 つの RDD を結合します。これにより、ブックセットに book1 と book2 の両方を持つユーザーの結果の RDD が得られるはずです。

于 2015-01-09T01:21:56.450 に答える