3

HectorまたはAstyanaxを使用して複合キー(1つの列にシリアル化されたものではなく複数の列)で行を取得することは可能ですか?

cqlshで、単純な列ファミリーを作成しました。

CREATE COLUMNFAMILY kkvv (x int, y int, val1 varchar, val2 varchar, PRIMARY KEY (x,y));

Cassandra Developer Centerによると、行はキーとしてxによって格納され、残りは列に格納されます。

与えられたxとyの列スライスを取得する方法がわかりません。

そのcqlのヘクターでcqlを実行する

cqlQuery.setQuery("select * from kkvv")

私に行を与えます:

Row(2、ColumnSlice([HColumn(x = 2)]))

Row(10、ColumnSlice([HColumn(x = 10)]))

そしてコンソールcqlshは以下を提供します:

x | y | val1 | val2

---- + ----- + ------- + -----------

2 | 1 | v1_1 | v2_1

10 | 27 | v1_4b | v2_4b

10 | 91 | v1_4a | v2_4a

誰かがJava用のcassandraクライアントでそれを行うことができましたか?そのためにthriftを使用できますか、それともcqlのみの機能ですか?

4

3 に答える 3

0

cassandra-tutorialプロジェクトで提供されているCompositeQuery.javaの例を試しましたか?

また、DataStaxによるコンポジットカラムの概要を読んだことがありますか?

于 2012-06-22T08:47:45.400 に答える
0

ここでは、CQL2とCQL3という2つの多少異なる構文が機能しています。デフォルトでは、Cassandra接続はCQL 2を想定しています。ただし、CQL 2は、ここで作成した種類の複合キー列ファミリーを理解しません。

したがって、cqlshでCQL 3を正しく使用しているようです。これは、列が適切に表示されているためですが、Hectorでは使用していません。HectorとAstyanaxのど​​ちらがそれをサポートしているかはまだわかりません。cassandra-jdbcドライバーの最新リリースでは機能するため、HectorやAstyanaxがそれを使用する場合は、それらも機能するはずです。

Thriftには、CQL 3のように、コンポジットコンパレータの列ファミリをマルチコンポーネントの主キーを持つテーブルとして扱うためのサポートはありません(おそらくサポートされません)。これが必要な場合は、CQL3を使用してください。

于 2012-06-21T17:42:01.120 に答える
0

複合キーを持つ行がCassandraにどのように格納されるかについての良い説明はここにあります。

AstyanaxとHectorで、私は面白いことに気づきました-接続しようとしたとき-それはCQL2を使用していました。cassandra api(以下の例のコード)を使用してCQL3でCassandraに接続すると、この設定がどこかに保存され、その後、AstyanaxとHectorはCQL2の代わりにcql3を使用しました。接続は別々の実行として行われたため、クライアント側に保存できませんでした...誰かがそれについて何か考えがありますか?

CQLバージョンは、set_cql_versionメソッドを使用してorg.apache.cassandra.thrift.Cassandra.Clientで設定できます。

誰かが純粋なCassandraAPIを使用した例の作業に興味がある場合:

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.List;

import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.Compression;
import org.apache.cassandra.thrift.CqlResult;
import org.apache.cassandra.thrift.CqlRow;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.SchemaDisagreementException;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

public class KKVVGetter {
    private static Cassandra.Client client;
    private static TTransport       transport;

    public static void main(String[] args) throws UnsupportedEncodingException, InvalidRequestException,
            UnavailableException, TimedOutException, SchemaDisagreementException, TException {

        transport = new TFramedTransport(new TSocket("localhost", 9160));
        TProtocol protocol = new TBinaryProtocol(transport);
        client = new Cassandra.Client(protocol);        
        transport.open();
        client.set_cql_version("3.0.0");

        executeQuery("USE ks_test3");

        show("select x,y,val1,val2 from kkvv where x > 1 and x < 11 and y < 100 and y > 2");

        System.out.println("\n\n*****************************\n\n");

        show("select x,y,val1,val2 from kkvv");

        transport.close();
    }

    private static int toInt(byte[] bytes) {
        int result = 0;
        for (int i = 0; i < 4; i++) {
            result = (result << 4) + (int) bytes[i];
        }
        return result;
    }

    private static CqlResult executeQuery(String query) throws UnsupportedEncodingException, InvalidRequestException,
            UnavailableException, TimedOutException, SchemaDisagreementException, TException {
        return client.execute_cql_query(ByteBuffer.wrap(query.getBytes("UTF-8")), Compression.NONE);
    }

    private static void show(String query) throws UnsupportedEncodingException, InvalidRequestException,
            UnavailableException, TimedOutException, SchemaDisagreementException, TException {
        CqlResult result = executeQuery(query);
        List<CqlRow> rows = result.getRows();
        System.out.println("rows: " + rows.size());
        for (CqlRow row : rows) {
            System.out.println("columns: " + row.getColumnsSize());
            for (Column c : row.getColumns()) {
                System.out.print("  " + new String(c.getName()));
                switch (new String(c.getName())) {
                    case "x":
                    case "y":
                        System.out.print("  " + toInt(c.getValue()));
                        break;
                    case "val1":
                    case "val2":
                        System.out.print("  " + new String(c.getValue()));
                        break;

                    default:
                        break;
                }
                System.out.println();
            }
        }
    }
}

問題のスキーマの例。

于 2012-06-26T16:24:05.273 に答える