blob对我来说的一个问题是,在java中,ByteBuffer(在cassandra中映射到blob)不是Serializable,因此不适用于EJB。
考虑到json相当大,在cassandra中存储json的更好类型。是文字还是blob?
在决定blob vs json时,json的大小是否重要?
如果它是像oracle这样的任何其他数据库,那么使用blob / clob是很常见的。但是在Cassandra,每个单元可以容纳2GB,这有关系吗?
在这种情况下,请将此问题视为文本与blob之间的选择,而不是根据有关是否为json使用单列的建议进行排序。
答案 0 :(得分:16)
我认为将文字 JSON数据作为BLOB
存储在Cassandra中有任何好处。最好,您的存储成本是相同的,一般而言,使用BLOB
类型的API在处理字符串/文本方面不太方便。
例如,如果您正在使用他们的Java API,那么为了使用参数化BLOB
将数据存储为PreparedStatement
,您首先需要将其全部加载到ByteBuffer
,例如将JSON数据打包到InputStream
。
除非您正在处理非常大的 JSON片段,否则会迫使您流式传输数据,这对于访问{{1}是一项额外的工作}类型。你会从中获得什么?基本上没什么。
但是,我认为要求' 我应该将JSON存储为文本,还是将其压缩并将压缩数据存储为BLOB
? &#39 ;.
答案归结为你如何配置Cassandra和你的桌子。特别是,只要您使用Cassandra 1.1或更高版本,您的表默认启用压缩。这可能就足够了,特别是如果你的JSON数据在每一行都相当一致。
但是,Cassandra的内置压缩是在表格范围内应用的,而不是单个行。因此,您可以通过在存储之前手动压缩JSON数据,将压缩字节写入BLOB
,然后将数据作为ByteBuffer
发送到Cassandra来获得更好的压缩率。
因此,从存储空间与编程方便性与CPU使用率的关系来看,它本质上归结为权衡。我会按如下方式决定:
BLOB
; BLOB
; BLOB
。 答案 1 :(得分:0)
由于数据不是二进制数据,因此几乎没有理由使用二进制大对象。当然你可以做到,但为什么呢?文本对于人类来说更容易阅读,并且实际上没有速度/大小差异(。
即使在其他数据库中,您也可以将JSON存储为文本。例如。甚至MySQL也有文本字段可以处理相当多的文本(LONGTEXT = 4Gb)。是的,甲骨文落后了,但希望他们有时也能获得合理的长文本。
但是为什么要将整个Json对象存储为文本? json应该真正规范化并存储为DB中的多个字段。
答案 2 :(得分:0)
我肯定会说文本比存储JSON的blob更好。 JSON最终是文本,所以这种类型有意义,但是blob可能还有额外的开销,因为一些驱动程序似乎要求在插入之前将它们转换为Hex。此外,blob在使用cqlsh时显示为base64编码的字符串,因此如果您需要进行测试,则无法轻松检查实际存储的JSON。我不确定blob是如何存储在磁盘上的,但我认为它与文本的方式非常相似。
话虽如此,存储大型条目可能会导致问题is not recommended。这可能会导致分片问题并消耗大量内存。虽然常见问题解答指的是超过64MB的文件,但从经验来看,即使文件平均每个文件几兆字节也可能在您开始存储大量文件时导致性能问题。如果可能的话,如果您希望JSON的大小为兆字节并且在Cassandra中存储对该存储的引用,那么最好使用对象存储。
答案 3 :(得分:-1)
在即将发布的2.2版本中,Cassandra还为JSON提供原生支持。 http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-2-json-support