私のプロジェクトでは、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 など) にしたい場合は、コードでどのような変更を行う必要がありますか?