0

私のプロジェクトでは、Datastax が提供する Apache Cassandra (v2.x) を使用しています。以下のように、Datasatx API を使用して ColumnFamily を作成しています。

//Create cluster
Cluster cluster = Cluster.builder().addContactPoint(hostNameOrIp)
//Get session
Session session = cluster.connect();
//create keyspace using session
session.execute(String.format("CREATE KEYSPACE IF NOT EXISTS %s WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': %d}",
            QueryBuilder.quote("MY_KS"), 
        1)
        );

String tableQuery = "CREATE TABLE timeline2 (
    key varchar,
    open float,
    high float,
    low float,
    close float,
    volume int,
    adjusted float,
    dtime timestamp,
    PRIMARY KEY (key, dtime)
)";

//create columnFamily using session
ResultSet result = session.execute(tableQuery);

私は現在、Datastax が提供する Cassandra からプレーンなバニラ風味の Apache Cassandra (v2.x) に移行し、Hector API を使用して同じことを行うように求められています。

ただし、Hector で同様の API を見つけることができませんでした。今までやってきたことは以下の通りです。

Map<String, String> accessMap = new HashMap<String, String>();
            accessMap.put("username", username);
            accessMap.put("password", password);

            Cluster cluster = HFactory.getOrCreateCluster("TEST_CLUSTER", new CassandraHostConfigurator(cassandraUrl), accessMap);

        ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("MY_KS", ComparatorType.BYTESTYPE);

        KeyspaceDefinition newKeyspaceDef = HFactory.createKeyspaceDefinition("MY_KS", ThriftKsDef.DEF_STRATEGY_CLASS, 1, Arrays.asList(cfDef));

        //Add the schema to the cluster.
        //"true" as the second param means that Hector will block until all nodes see the change.
        cassandraCluster.addKeyspace(newKeyspaceDef, true);

        Keyspace ksp = HFactory.createKeyspace("MY_KS", cassandraCluster);

私は今この点で立ち往生しています。Datastax API で可能だったように (つまり、単純な CQL を与えることによって) CREATE TABLE に単純なクエリ文字列を与えることができる API を Hector で見つけることができません。Hector WIKI で見たオプションの 1 つは、ColumnFamilyTemplate を使用していました。私が見た他のオプションは、BasicColumnDefinition を使用していました。私が使用していた別のオプションは、 Mutator.insert() 操作を使用していました。

しかし、これらの解決策はどれも、テーブルの列 (別名列ファミリー) の「データ型」をどのように定義するかについて十分に明確ではありません。

さらに、Serializers (StringSearlizer など) と Comparators が正確に何であるかについて、十分なガイダンス/API の詳細が明確ではありません。

誰かがこれについて私を助けてくれますか? 私の全体的な目的は、単純な CQL クエリを取得して実行できる API を Hector で検索することです (Datastax API で可能です)。


@アレックス・ポペスク

明確にしてくれてありがとう、私は今理解しました。

クライアントを次のように変更しました。

   //This will give a connection to the cluster     
    Cluster cassandraCluster = connectApacheCassandra();

    ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("TEST_KS", "TEST_CF",
    ComparatorType.BYTESTYPE);

    KeyspaceDefinition newKeyspaceDef = HFactory.createKeyspaceDefinition("TEST_KS",                ThriftKsDef.DEF_STRATEGY_CLASS, 1, Arrays.asList(cfDef));


            cassandraCluster.addKeyspace(newKeyspaceDef, true);

            Keyspace ksp = HFactory.createKeyspace("TEST_KS", cassandraCluster);        

            BasicColumnFamilyDefinition columnFamilyDefinition = new BasicColumnFamilyDefinition(cfDef);

            cassandraCluster.addKeyspace(newKeyspaceDef, true);

            Keyspace ksp = HFactory.createKeyspace("TEST_KS", cassandraCluster);        

            BasicColumnFamilyDefinition columnFamilyDefinition = new BasicColumnFamilyDefinition(cfDef);

        BasicColumnDefinition columnDefinition = new BasicColumnDefinition();
        columnDefinition.setName(StringSerializer.get().toByteBuffer("aKey"));
        columnDefinition.setIndexName("key_idx1");
        columnDefinition.setIndexType(ColumnIndexType.KEYS);
        columnDefinition.setValidationClass(ComparatorType.LONGTYPE.getClassName());
        columnFamilyDefinition.addColumnDefinition(columnDefinition);

        columnDefinition = new BasicColumnDefinition();
        columnDefinition.setName(StringSerializer.get().toByteBuffer("aTestColumn"));    
        columnDefinition.setValidationClass(ComparatorType.LONGTYPE.getClassName());
        columnFamilyDefinition.addColumnDefinition(columnDefinition);    

        cassandraCluster.updateColumnFamily(new ThriftCfDef(columnFamilyDefinition));

cqlsh を使用してクエリ DESCRIBE COLUMNFAMILY "TEST_CF" の出力を確認すると、次の出力が得られます。

CREATE TABLE "TEST_CF" (
  key blob,
  column1 blob,
  "614b6579" bigint,
  "6154657374436f6c756d6e" bigint,
  value blob,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=1.000000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='NONE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

この出力を理解できません。この出力に列「aKey」と「aColumn」が表示されません。列名を「キー」、「列1」などとして表示する出力はどうですか(コードで言及したことはありません)。さらに、この出力に表示されるデータ型を理解できません。

私の期待は、以下のような出力を持つことです:

CREATE TABLE TEST_CF (
    aKey varchar,
    aColumn varchar
    PRIMARY KEY (aKey )
)";

期待した出力が得られないように、Hector API のどこで間違いを犯しているのか指摘していただけますか? また、列のデータ型を varchar 以外 (float など) にしたい場合は、コードでどのような変更を行う必要がありますか?

4

2 に答える 2