Java 复合柱的Cassandra柱族?
我正在为Cassandra中的用例设计列族。我计划使用动态柱结构 下面是我对每个用例的要求-Java 复合柱的Cassandra柱族?,java,cassandra,composite,Java,Cassandra,Composite,我正在为Cassandra中的用例设计列族。我计划使用动态柱结构 下面是我对每个用例的要求- user-id column1 column2 column3 123 (Column1-Value Column1-SchemaName LMD) (Column2-Value Column2-SchemaName LMD
user-id column1 column2 column3
123 (Column1-Value Column1-SchemaName LMD) (Column2-Value Column2-SchemaName LMD) (Column3-Value Column3-SchemaName LMD)
对于每个用户id,我们将存储column1及其值,该值将始终存储这三个内容-
(Column1-Value Column1-SchemaName LMD)
在上面的示例中,我只显示了三列,但它可能有更多的列
现在我不确定,如何始终在列值级别存储这三件事?我应该在列级别使用复合列吗?如果是,那么我不知道如何在Cassandra中创建这样的列族
Column1-value will be in binary, Column1-SchemaName will be String, LMD will be DateType.
这就是我目前所拥有的-
create column family USER_DATA
with key_validation_class = 'UTF8Type'
and comparator = 'UTF8Type'
and default_validation_class = 'UTF8Type'
and gc_grace = 86400
and column_metadata = [ {column_name : 'lmd', validation_class : DateType}];
有人能帮我设计这个专栏系列吗?@TechGeeky
将比较器更改为:
comparator = 'CompositeType(ByteType,UTF8Type,DateType)'
列值的ByteType
列模式名的UTF8Type
LMD的日期类型
但是要小心,使用这种设计,除了按用户id查询数据外,很难查询数据。特别是,如果您事先知道列数据,您可以通过提供列数据(以字节为单位)来获取列的切片…我建议您使用CQL3。如果您使用Cassandra 1.2+和CQL3,下表将生成您描述的分区(行)布局
CREATE TABLE user_data (
userid text,
data bytes,
schema_name string,
lmd timestamp,
PRIMARY KEY (userid, data, schema_name, lmd)
)
有关CQL3如何最终成为引擎盖下的复合柱并使其更易于使用的更多信息,请参见以下文章:我对这种方法感到困惑<代码>比较器用于列名。。对吗?但我需要复合值。。每列都有复合值。在我的例子中,我需要在一个列中有三个值。而该列名可以是
e1
,e2
或e3
或我的情况下的任何东西..“comparator是指列名..对吗?”-->准确。在这种情况下,列名将是v1:v2:v3的复合值。v1是一个字节[],v2是一个字符串,v3是一个日期,我看到了,但我需要的是-columnName应该是单个字符串,如e1
,列值应该是v1:v2:v3
的复合值v1
是字节[],v2
是字符串,v3
是日期。可以这样做吗?“列值应该是v1:v2:v3的复合值”-->在这种情况下,在Java中创建一个封装v1、v2和v3的类。然后将该类序列化为JSON。您可以通过将列值类型定义为UTF8TYPE来存储此JSON负载。感谢doanduyhai的建议。这是我最后一个将所有内容序列化为JSON的解决方案。但是在走这条路之前,有没有办法使用卡桑德拉本身的任何特性呢?