【问题标题】:Storing a list of mixed types in Cassandra在 Cassandra 中存储混合类型的列表
【发布时间】:2014-06-25 21:39:31
【问题描述】:

在 Cassandra 中,当指定表和字段时,必须为每个字段指定类型(textintboolean 等)。这同样适用于集合,您必须将集合锁定为特定类型(set<text> 等)。

我需要在 Cassandra 中存储混合类型的列表。该列表可能包含数字、字符串和布尔值。所以我需要像list<?> 这样的东西。

这在 Cassandra 中是否可行?如果不可行,您会建议什么解决方法来存储混合类型项目的列表?我画了一些草图,但似乎没有一个是正确的方法......

【问题讨论】:

标签: cassandra cassandra-2.0


【解决方案1】:

Cassandra 的 CQL 接口是严格类型化的,因​​此您将无法创建具有非类型化集合列的表。

我基本上看到了两种选择:

  • 创建一个列表字段,并将所有内容转换为文本(不太好,我同意)
  • 使用thift API 并按原样存储所有内容。

【讨论】:

  • 感谢您的建议,我还考虑将所有内容都转换为字符串(添加某种元数据前缀,例如“!int:”),但它确实很难看,并且使查询变得困难。我是 Cassandra 的新手,但我看到 Thrift 协议在某种程度上已被弃用,并希望避免使用它(即使即将发布的 2.1 版本中的 cqlsh 似乎也使用本机协议而不是 Thrift)。
【解决方案2】:

按照http://www.mail-archive.com/user@cassandra.apache.org/msg37103.html 的建议,我决定将各种值编码为二进制并将它们存储到list<blob>。这允许仍然查询集合值(在 Cassandra 2.1+ 中),只需对查询中的值进行编码。

在python上,最简单的方法可能是在存储数据时进行pickle和hexify:

pickle.dumps('Hello world').encode('hex')

然后加载它:

pickle.loads(item.decode('hex'))

使用pickle 将实现绑定到python,但它在加载时会自动转换为正确的类型(int、string、boolean 等),所以很方便。

【讨论】:

  • +1 我想知道这个,并认为也许你可以在 Cassandra 2.1 中解决这个问题,它应该有用户定义的类型。不过,很好的解决方法。
  • @BryceAtNetwork23 实际上,用户定义的类型没有帮助。我可以定义一个list<myowntype>,但是我仍然需要为每种类型指定单独的字段。所以它会起作用,但不会比为每种类型使用单独的列表更好。
猜你喜欢
  • 2014-08-25
  • 2015-03-06
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2016-08-08
  • 1970-01-01
相关资源
最近更新 更多