我是cassandra cli的新手,我想知道将列名定义为 LongType 而不是 Utf8type 是一个好习惯,请告诉我是我的代码或编码风格有什么问题吗?
我正在使用hector在playframe中的scala中进行此操作。
val mutator = HFactory.createMutator(Group, le);
mutator.addInsertion(groupId,"groupRefrence",HFactory.createColumn(userId,userId,le,le))
mutator.execute()
def getMembersRefrence(groupId: Long) = {
val sliceQuery = HFactory.createSliceQuery(Group, le, le, le)
sliceQuery.setColumnFamily("groupRefrence")
sliceQuery.setKey(groupId)
sliceQuery.setRange(Long.MIN_VALUE,Long.MAX_VALUE, false, Integer.MAX_VALUE)
val result = sliceQuery.execute()
val res = result.get()
val columns = res.getColumns()
val response = columns.toList
response
}
答案 0 :(得分:3)
将列名称定义为LongType而不是Utf8type
的良好做法
您应该将列名数据类型定义为对数据模型有意义的数据类型。至于最佳实践,eBay posted a tech blog在几年前就已经开始了,这绝对是一个很好的阅读。 Part 2涵盖了列名:
在列名中存储值完全可以
将列值保留为空(“无值”列)也可以。
Cassandra存储值(实际数据)是一种常见做法 在列名(a.k.a.列键)中,甚至离开列 如果没有其他东西要存储,则value字段为空。一个动机 对于这种做法是列名称存储物理排序, 但列值不是。
注意:
最大列键(和行键)大小为64KB。但是,不要 存储类似“项目描述”的内容作为列键!
请勿使用 时间戳单独作为列键。您可能会遇到冲突的时间戳 来自两个或更多写入Cassandra的app服务器。更喜欢timeuuid (类型1 uuid)而不是。
最大列值大小为2 GB。但 因为没有流,并且整个值都在堆中获取 请求内存时,将大小限制为仅几MB。 (大 在不久的将来不太可能支持对象 - 卡桑德拉-265。但是,Astyanax客户端库支持大型 通过分块来对象。)
我也不得不提到较新版本的Cassandra正在逐渐远离原始列系列和cli交互。我不确定较新的CQL3驱动程序是否支持在列名中存储值(我还必须通过Thrift使用Hector,而不是CQL3)。在任何情况下,这里都有一篇很好的文章(A thrift to CQL3 upgrade guide)来描述这些差异,这是你应该通读的未来的努力。