Rub*_*ski 3 schema command-line-interface cassandra super-columns
我想在我的数据库中使用cassandra -cli以下结构
例如,我有一个人的地址,地址包含一个zipcode,housenumber等原理图,它看起来像这样:
name: "address",
value: {
city: {name: "city", value: "San Francisco"},
street: {name: "street", value: "555 Union Street"},
zip: {name: "zipcode", value: "94105"},
}
Run Code Online (Sandbox Code Playgroud)
我知道如何创建超列和普通列.但我想使用column_metadata来指定超级列中的列的外观.所以这最终会是这样的:
Create column family person
with comparator = UTF8Type
and key_validation_class=UTF8Type
and default_validation_class = UTF8Type
and compression_options =
{sstable_compression:SnappyCompressor, chunk_length_kb:64}
and column_metadata = [
{column_type: super, column_name: address, validation_class: UTF8Type
column_metadata =[
{column_name: city, validation_class: UTF8Type}
{column_name: Street, validation_class: UTF8Type}
{column_name: zip, validation_class: UTF8Type}
{column_name: housnumber, validation_class: LongType}
];
Run Code Online (Sandbox Code Playgroud)
这是可能吗?
如果我可以将超级列放在另一个超级列中,那就更好了.这样,超级列"地址"可以包含多个超级列"地址",其中包含列:"street","zip"等.
超级列上的列元数据已经应用于子列本身.在您的示例中,您将super列的validation_class设置为UTF8Type.这实际上没有意义,因为超级列的值本身不是UTF8.超级列名称已经过验证,并根据您设置为UTF8Type的比较器类型进行排序.
所以你需要的是:
column_metadata = [
{column_name: city, validation_class: UTF8Type}
{column_name: Street, validation_class: UTF8Type}
{column_name: zip, validation_class: UTF8Type}
{column_name: housnumber, validation_class: LongType}
];
Run Code Online (Sandbox Code Playgroud)
值得注意的是,此元数据将应用于行中的所有超级列.因此,如果您有多个超级列,其子列名为"city",则验证将应用于所有这些列.
我还要注意,通常不鼓励使用超级柱,因为它们有几个缺点.读取一个子列时,需要对超级列中的所有子列进行反序列化,并且不能在超级列上设置二级索引.它们也只支持一级嵌套.
http://www.datastax.com/docs/1.0/ddl/column_family#about-super-columns
要实现任意级别的嵌套,可以将CompositeType用作常规列族的列比较器.不幸的是,目前关于CompositeType的文档并不多.我建议查看源代码以获取更多信息src/java/org/apache/cassandra/db/marshal/CompositeType.java.
| 归档时间: |
|
| 查看次数: |
3506 次 |
| 最近记录: |