在cassandra中将json存储为文本vs blob的优缺点是什么?

pin*_*her 15 java json blob cassandra

blob对我来说的一个问题是,在java中,ByteBuffer(在cassandra中映射到blob)不是Serializable,因此不适用于EJB.

考虑到json相当大,在cassandra中存储json的更好类型.是文字还是blob?

在决定blob vs json时,json的大小是否重要?

如果它是像oracle这样的任何其他数据库,那么通常使用blob/clob.但在Cassandra,每个单元可以容纳2GB,这有关系吗?

请将此问题视为本案例中text和blob之间的选择,而不是排序到是否为json使用单列的建议.

aro*_*oth 17

我不认为将文字 JSON数据存储为BLOBCassandra 有任何好处.最多,您的存储成本是相同的,并且通常API在处理BLOB类型方面不太方便,因为它们用于处理字符串/文本.

例如,如果您正在使用他们的Java API,那么为了将数据存储为BLOB使用参数化,PreparedStatement您首先需要将其全部加载到a中ByteBuffer,例如将JSON数据打包到InputStream.

除非您正在处理非常大的 JSON片段,否则会强制您流式传输数据,这对于访问该BLOB类型来说是一项额外的工作.你会从中获得什么?基本上没什么.

但是,我认为有一些优点要问' 我应该将JSON存储为文本,还是将其压缩并将压缩数据存储为BLOB".

答案就是你如何配置Cassandra和你的桌子.特别是,只要您使用Cassandra 1.1或更高版本,您的表默认启用压缩.这可能就足够了,特别是如果您的JSON数据在每一行中相当一致.

但是,Cassandra的内置压缩是在表范围内应用的,而不是单个行.因此,您可以通过在存储之前手动压缩JSON数据,将压缩的字节写入a ByteBuffer,然后将数据作为a将数据传送到Cassandra 来获得更好的压缩率BLOB.

因此,它主要归结为存储空间与编程方便性与CPU使用率之间的权衡.我会按如下方式决定:

  1. 最大限度地减少您关注的存储量?
    • 如果是,则压缩JSON数据并将压缩的字节存储为BLOB;
    • 否则,请继续#2.
  2. Cassandra的内置压缩是否适用于您的桌面?
    • 如果否(如果无法启用压缩),则压缩JSON数据并将压缩的字节存储为BLOB;
    • 否则,请继续#3.
  3. 您要存储的数据在每行中是否相对统一?
    • 可能对于JSON数据,答案是"是",在这种情况下,您应该将数据存储为文本并让Cassandra处理压缩;
    • 否则进入#4.
  4. 你想要效率还是方便?
    • 效率; 压缩JSON数据并将压缩的字节存储为BLOB.
    • 方便; 压缩JSON数据,base64压缩数据,然后将base64编码的数据存储为文本.