无法使用Astyanax客户端创建具有复合键的表 [英] Can't create table with composite key using Astyanax client

查看:122
本文介绍了无法使用Astyanax客户端创建具有复合键的表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用astyanax client创建使用复合键的表。现在我使用cqlsh -3创建它,这是它在cli中的样子:

How do I create table with composite keys using astyanax client. For now I've created it with cqlsh -3, and this is how it looks like in cli:

[default@KS] describe my_cf;
    ColumnFamily: my_cf
      Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type
      Default column value validator: org.apache.cassandra.db.marshal.UTF8Type
      Columns sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.TimeUUIDType,org.apache.cassandra.db.marshal.UTF8Type)
      GC grace seconds: 864000
      Compaction min/max thresholds: 4/32
      Read repair chance: 0.1
      DC Local Read repair chance: 0.0
      Replicate on write: true
      Caching: KEYS_ONLY
      Bloom Filter FP chance: default
      Built indexes: []
      Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
      Compression Options:
        sstable_compression: org.apache.cassandra.io.compress.SnappyCompressor

这是我期望它在cqlsh:

This is how I would expect it to be in cqlsh:

 CREATE TABLE my_cf (
                   ... key text,
                   ... timeid timeuuid,
                   ...   flag boolean,
                   ...   data text,
                   ... PRIMARY KEY (key, timeid));

我使用存储为blob的复合键,这是一个问题。

I got it working with composite key stored as a blob which is a problem.

public class MyKey {
    @Component(ordinal=0)
    private String key;
    @Component(ordinal=1)
    private UUID timeid;
 //...
}

CF

public static ColumnFamily<MyKey, String> MY_CF = ColumnFamily
        .newColumnFamily("my_cf",
                new AnnotatedCompositeSerializer<MyKey>(MyKey.class),
                StringSerializer.get());

KS

                ksDef = cluster.makeKeyspaceDefinition();

                ksDef.setName(keyspaceName)
                        .setStrategyOptions(keyspaceOptions)
                        .setStrategyClass("SimpleStrategy")
                        .addColumnFamily(
                                cluster.makeColumnFamilyDefinition()
                                        .setName(MY_CF.getName())
                                        .setComparatorType("UTF8Type")
                                        .setDefaultValidationClass("UTF8Type")
// blob if no key validation class specified
// and something looking as a string if I use this:     .setKeyValidationClass("CompositeType(UTF8Type, TimeUUIDType)")
// anyway there's a single column per composite key

                                        .addColumnDefinition(
                                                cluster.makeColumnDefinition()
                                                        .setName("flag")
                                                        .setValidationClass(
                                                                "BooleanType"))
                                        .addColumnDefinition(
                                                cluster.makeColumnDefinition()
                                                        .setName("data")
                                                        .setValidationClass(
                                                                "UTF8Type")));
                cluster.addKeyspace(ksDef);

突变

            MutationBatch m = ks.prepareMutationBatch();

            for (char keyName = 'A'; keyName <= 'C'; keyName++) {
                MyKey myKey = new MyKey("THEKEY_" + keyName, TimeUUIDUtils.getUniqueTimeUUIDinMillis());
                ColumnListMutation<String> cfm = m.withRow(MY_CF, myKey);
                cfm.putColumn("flag", true, null);
                cfm.putColumn("data", "DATA_" + keyName, null);
            }
            m.execute();

cqlsh:KS> describe columnfamily my_cf;

cqlsh:KS>describe columnfamily my_cf;

CREATE TABLE my_cf (
  KEY blob PRIMARY KEY,
  flag boolean,
  data text
) WITH ...

cqlsh:KS> select * from my_cf;

cqlsh:KS>select * from my_cf;

  key                                                      | flag | data
----------------------------------------------------------+--------+---------
 00064953494e5f420000109f4513d0e3ac11e19c400022191ad62b00 | True   | DATA_B

cqlsh:KS> select * from my_cf where key ='THEKEY_B'order by timeid desc; / p>

cqlsh:KS> select * from my_cf where key = 'THEKEY_B' order by timeid desc;

Bad Request: Order by on unknown column timeid



在cassandra-cli下面看起来不错吗?为什么它不能在cqlsh中工作?



cassandra-cli] list my_cf;

doesnt' it look right in cassandra-cli below? why it doesn't work in cqlsh?

cassandra-cli] list my_cf;

RowKey: THEKEY_B:09f29941-e3c2-11e1-a7ef-0022191ad62b
=> (column=active, value=true, timestamp=1344695832788000)
=> (column=data, value=DATA_B, timestamp=1344695832788000)






我做错了什么?
(astyanax 1.0.6,cassandra 1.1.2)
cqlsh> [cqlsh 2.2.0 | Cassandra 1.1.2 | CQL spec 3.0.0 | Thrift协议19.32.0]


What am I doing wrong? (astyanax 1.0.6, cassandra 1.1.2) cqlsh>[cqlsh 2.2.0 | Cassandra 1.1.2 | CQL spec 3.0.0 | Thrift protocol 19.32.0]

推荐答案

从我已经能够弄清楚,复合主键
表示在
cassandra的协议和接口的主要分歧和您使用的协议控制您有
访问的功能。

From what I've been able to figure out, composite primary keys represent a major divergence in the protocol and interface to cassandra and the protocol you use controls the features you have access to.

例如,astyanax和hector主要是thrift协议
客户端,而CQL,不仅仅是一种语言,是(或将是?)二进制协议。

For instance, astyanax and hector are primarily thrift protocol clients, while CQL, more than just a language, is (or will be?) a binary protocol.

不是等价的,CQL3与复合主
键使事情非常不同。

The two protocols are not equivalent and CQL3 with composite primary keys makes things very different.

复合主键要理解的TABLES $ b本质上转换为具有复合列名称的宽行。
主键的第一部分是行键,其余部分
用作前缀,并且作为列名在
的宽行中使用TABLE-列名。

The thing to understand about "TABLES" with composite primary keys is that they essentially translate into wide rows with composite column names. The first part of the primary key is the row key and the remaining parts are used as a prefix along with the TABLE-column name as the column name in the wide row.

在你的实例中,行键是key,列前缀是
timeid,所以你插入的标志字段实际上是一个
column named:flag and data is:data and so
on。

In your instance, the row key is "key" and the column prefix is "timeid", so the flag field of what you are inserting is actually a column named :flag and data is :data and so on.

为了使这个工作,cassandra的CQL协议接口是
将TABLES转换为宽行,并透明地处理所有的
列命名。

In order for this to work, the CQL protocol interface to cassandra is converting "TABLES" into wide rows and transparently handling all of that column naming.

thrift接口不处理这些东西,并且当你
做一个变异,它只是写列,就像它用于,没有
虚拟寻址。

The thrift interface doesn't take care of this stuff and and when you do a mutation, it just writes columns like it is used to, without the virtual addressing.

事实上,结果不正确在你的cassandra-cli。如果你从cqlsh -3插入,这里是从cassandra-cli的角度看(用一个简单的文本日期):

So, in fact, the results do not look right in your cassandra-cli. If you do an insert from cqlsh -3, here is what it should look like from the cassandra-cli point of view (with a simple text date):

[default@testapp] list my_cf;
RowKey: mykey
=> (column=20120827:data, value=some data, timestamp=1346090889361000)
=> (column=20120827:flag, value=, timestamp=1346090889361001)

CQL3和表看起来真的很有吸引力,但有一些折衷,似乎还没有固体的java客户端支持。

CQL3 and tables look really attractive, but there are some trade-offs to be made and there doesn't seem to be solid java client support yet.

这篇关于无法使用Astyanax客户端创建具有复合键的表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆