复合柱的 Cassandra 柱族?
Posted
技术标签:
【中文标题】复合柱的 Cassandra 柱族?【英文标题】:Cassandra column family for Composite Columns? 【发布时间】:2013-09-17 23:42:08 【问题描述】:我正在为 Cassandra 中的用例设计列族。我打算使用动态列结构。
以下是我对用例的要求-
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];
谁能帮助我为此设计列族?
【问题讨论】:
【参考方案1】:@TechGeeky
将比较器更改为:
comparator = 'CompositeType(ByteType,UTF8Type,DateType)'
列值的字节类型
列-SCHemaName 的 UTF8Type
LMD 的日期类型
但请注意,使用这种设计,查询您的数据而不是通过用户 ID 会很困难。特别是如果您事先知道它们,您可以通过提供列数据(以字节为单位)来获取列的切片......
【讨论】:
我对这种方法感到困惑。comparator
用于列名。对吗?但我需要复合值。每列都有复合值。就我而言,我需要在单个列中包含三个值。该列名称可以是 e1
、e2
或 e3
或任何在我的情况下..
"比较器用于列名。对吗?" --> 准确。在这种情况下,您的列名将是 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 的最后一个解决方案。但是在走这条路之前,有什么办法可以使用 Cassandra 本身的任何功能吗?【参考方案2】:
我建议你使用 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 如何最终成为底层复合列的更多信息,并使它们更易于使用:http://www.datastax.com/dev/blog/cql3-for-cassandra-experts
【讨论】:
以上是关于复合柱的 Cassandra 柱族?的主要内容,如果未能解决你的问题,请参考以下文章