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