Cassandra新手问题。我正在使用REST调用从社交网站收集一些数据。所以我最终以JSON格式返回数据。
JSON只是我表中的一列。我试图弄清楚"最佳做法"用于存储JSON字符串。
首先我考虑使用 map 类型,但JSON包含字符串,数字类型等的组合。我似乎不能为地图键声明通配符类型/值。 JSON字符串可能非常大,可能超过10KB。我可以将它存储为字符串,但似乎效率低下。我认为这是一项常见的任务,因此我确信有一些关于如何执行此操作的一般指导原则。
我知道Cassandra本身支持JSON,但据我所知,当整个JSON映射与数据库模式匹配1-1时,主要使用它。对我来说情况并非如此。模式有一堆列,JSON字符串只是一种"有效负载"。将JSON字符串存储为 blob 还是文本更好?顺便说一句,Cassandra版本是2.1.5。
任何提示都表示赞赏。提前致谢。
答案 0 :(得分:15)
在Cassandra存储引擎中,blob和文本之间的区别并不大,因为Cassandra基本上将文本存储为blob。是的"本地人"您所说的JSON支持仅适用于您的数据模型与您的JSON模型匹配的情况,而且仅适用于Cassandra 2.2 +。
我会将其存储为文本类型,在发送数据时(或处理解压缩),您不必实现压缩JSON数据的任何内容。由于Cassandra的二进制协议支持transport compression。还要确保您的表存储data compressed具有相同的压缩算法(我建议使用LZ4,因为它是最快的算法),以节省对每个读取请求进行压缩。因此,如果您配置存储压缩的数据并使用传输压缩,您甚至不必自己实现。
您没有说出您正在使用的客户端驱动程序,但此处提供了有关如何为Datastax Java Client Driver设置传输压缩的文档。
答案 1 :(得分:3)
这取决于如何查询您的JSON。有三种可能的策略:
当您使用 cqlsh 在命令行上查询数据时,或者您想直接调试数据时,选项1具有人类可读的优势。缺点是这个JSON列的大小(10k)
选项2的优势在于保持JSON有效负载较小,因为文本元素具有相当不错的压缩比。缺点是:a。你需要照顾压缩/解压缩客户端和b。它不是人类直接可读的
选项3具有选项1(大小)和2(不可读)的缺点