2014-03-06 31 views
1

我在卡桑德拉CLI新的,我想知道的是它是一个很好的做法来定义列名的LongType代替Utf8type,也请告诉我的代码或编码风格有什么问题吗?
我在scala中使用hector进行playframework。列名称

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 
} 

回答

3

好的做法定义的列名作为LongType而不是Utf8type

你应该定义你的列名的数据类型,以任何有意义的数据模型。就最佳做法而言,eBay posted a tech blog就在几年前,这绝对是一个很好的阅读。 Part 2涵盖列名:列名

存储值是完全OK

离开列值空(“毫无价值”列)也行。

这是一个与卡桑德拉一种常见的做法存储值(实际数据) 列名(又名列键),甚至离开列 值字段为空,如果没有别的存储。这种做法的一个动机 是列名称存储物理排序, 但列值不是。

注:

  • 最大列密钥(和行密钥)的大小是64KB。但是,不要 存储'项目描述'作为列键!

  • 不要单独使用 时间戳作为列键。您可能会碰撞来自两个或多个应用程序服务器的时间戳 ,这些应用程序服务器正在向Cassandra写入数据。建议使用timeuuid (类型1 uuid)。

  • 最大列值大小为2 GB。但是由于 因为没有流式传输,并且在请求时整个值在堆内存中被获取,因此将大小限制为仅几MB。 (大 对象不太可能在不久的将来得到支持 - 卡桑德拉-265不过,Astyanax客户端库通过分块他们支持大 对象。)

我也觉得有必要提Cassandra的新版本正在摆脱原来的专栏系列和cli互动。我不确定新的CQL3驱动程序是否支持在列名中存储值(我也必须通过Thorft与Hector,而不是CQL3来完成)。无论如何,这是一篇很好的文章(A thrift to CQL3 upgrade guide),它描述了这些差异,这是你应该为未来的努力阅读的东西。