我一直在使用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)的简单vanila风格,并使用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);
我现在陷入了这一点。我无法在Hector中找到API,我可以使用Datastax API(即通过提供简单的CQL)为CREATE TABLE提供一个简单的查询字符串, 我确实通过互联网探索了各种其他选项,但无法获得直接的解决方案。 我在Hector WIKI上看到的一个选项是使用ColumnFamilyTemplate。 我看到的其他选项是使用BasicColumnDefinition。 我的另一个选择是使用Mutator.insert()操作。
但是这些解决方案中没有一个能够清楚地说明如何定义表格列的“数据类型”(a.k.a列族)。
此外,关于Serializers(StringSearlizer等)和Comparators究竟是什么的指导/ API细节还不够明确。
有人可以帮我解决这个问题吗?我的总目标是在Hector中搜索API,它可以进行简单的CQL查询并执行它们(就像使用Datastax API一样)。
@Alex Popescu
感谢您的澄清,我现在明白了。
我现在修改了我的客户端,如下所示:
//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”。输出如何显示列名称为“key”,“column1”等(我的代码中从未提及过它们)。 此外,我无法理解此输出中显示的数据类型。
我的期望是输出如下:
CREATE TABLE TEST_CF (
aKey varchar,
aColumn varchar
PRIMARY KEY (aKey )
)";
你能否指出我在Hector API中出错的地方,以便我得不到预期的输出? 另外,如果我希望列数据类型不是varchar(比如float);我应该在代码中做些什么改变?
答案 0 :(得分:1)
您必须使用HFactory.createColumnFamilyDefinition(..)
。该定义可以添加到群集中:cluster.addColumnFamily(columnFamilyDefinition)
。
Hector对CQL有一些支持,但我还没有使用它。可能您也可以使用CQL来创建列族。
答案 1 :(得分:0)
DataStax Java驱动程序正在使用CQL协议(版本3),而Hector正在使用Thrift API。您将无法通过Hector运行CQL查询(版本3)。
额外:即使底层存储相同,使用CQL v Thrift存储数据的方式并不总是兼容的。您可以从Difference between Thrift and CQL 3 Columns/Rows
的答案中了解有关这些差异的更多信息