1

我是 cassandra cli 的新手,我想知道将列名称定义为LongType而不是Utf8type是一种好习惯,还请告诉我我的代码或编码风格有什么问题吗?
我正在与 hector 在 playframework 中的 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
}
4

1 回答 1

3

将列名称定义为 LongType 而不是 Utf8type 的良好做法

您应该将列名数据类型定义为对您的数据模型有意义的任何内容。就最佳实践而言, eBay几年前在此 发布了一篇技术博客,这绝对是一本好书。第 2 部分涵盖列名:

在列名中存储值是完全可以的

将列值留空(“无价值”列)也可以。

Cassandra 的一种常见做法是在列名(又名列键)中存储一个值(实际数据),如果没有其他内容可存储,甚至将列值字段留空。这种做法的一个动机是列名是按物理排序存储的,但列值不是。

笔记:

  • 最大列键(和行键)大小为 64KB。但是,不要将“项目描述”之类的内容存储为列键!

  • 不要单独使用时间戳作为列键。您可能会从两个或多个写入 Cassandra 的应用程序服务器中获得冲突的时间戳。更喜欢 timeuuid (type-1 uuid)。

  • 最大列值大小为 2 GB。但是因为没有流式传输,并且在请求时整个值都在堆内存中获取,所以将大小限制为只有几 MB。(在不久的将来不太可能支持大对象——Cassandra-265。但是,Astyanax 客户端库通过分块来支持大对象。)

我还不得不提一下,Cassandra 的新版本正在远离原来的列族和 cli 交互。我不确定较新的 CQL3 驱动程序是否支持将值存储在列名中(我也必须通过 Thrift 和 Hector 来实现,但不是 CQL3)。无论如何,这里有一篇很好的文章(A thrift to CQL3 upgrade guide)描述了这些差异,你应该阅读它以备将来努力。

于 2014-03-06T15:01:37.967 回答