Hector cassandra的Hector客户端 - 如何创建表?

时间:2014-01-31 05:10:01

标签: cassandra datastax cql hector

我一直在使用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);我应该在代码中做些什么改变?

2 个答案:

答案 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

的答案中了解有关这些差异的更多信息