在 Cassandra 列中存储 JSON 字符串的有效方法?
Efficient way to store a JSON string in a Cassandra column?
Cassandra 新手问题。我正在使用 REST 调用从社交网站收集一些数据。所以我最终以 JSON 格式返回数据。
JSON 只是我的 table 中的一列。我想弄清楚 "best practice" 是用来存储 JSON 字符串的。
首先我想到了用map类型,但是JSON里面混合了字符串,数值类型等等,好像不行声明地图 key/value 的通配符类型。 JSON 字符串可能非常大,可能超过 10KB。我可以将它存储为一个字符串,但看起来效率很低。我认为这是一项常见任务,因此我确信有一些关于如何执行此操作的一般准则。
我知道 Cassandra 原生支持 JSON,但据我了解,这主要用于整个 JSON 映射与数据库模式 1-1 匹配时。我不是这样的。该模式有一堆列,JSON 字符串只是一种 "payload"。将 JSON 字符串存储为 blob 还是 text 更好?顺便说一句,Cassandra 版本是 2.1.5.
感谢任何提示。提前致谢。
这取决于你想如何查询JSON。有 3 种可能的策略:
- 存储为字符串
- 存储为压缩的 blob
- 存储为 blob
选项 1 的优点是当您使用 cqlsh 在命令行上查询数据时,或者如果您想直接实时调试数据时,人类可读。缺点是这个 JSON 列的大小 (10k)
选项 2 的优点是可以保持较小的 JSON 负载,因为文本元素具有相当不错的压缩率。缺点是:你需要照顾 compression/decompression 客户端和 b。它不是人类直接可读的
选项 3 具有选项 1(大小)和选项 2(不可读)的缺点
在 Cassandra 存储引擎中,blob 和文本之间确实没有太大区别,因为 Cassandra 本质上将文本存储为 blob。是的,您所说的 "native" JSON 支持仅适用于您的数据模型与您的 JSON 模型匹配的情况,并且仅适用于 Cassandra 2.2+。
我会将其存储为文本类型,您在发送数据(或处理解压缩)时不必执行任何压缩 JSON 数据的操作。由于 Cassandra 的二进制协议支持使用相同的压缩算法执行 transport compression. Also make sure your table is storing the data compressed(我建议使用 LZ4,因为它是最快的算法实现)以节省为每个读取请求执行压缩。因此,如果您配置存储压缩数据并使用传输压缩,您甚至不必自己实施。
您没有说明您使用的是哪个客户端驱动程序,但这里是关于如何为 Datastax Java Client Driver.
设置传输压缩的文档
Cassandra 新手问题。我正在使用 REST 调用从社交网站收集一些数据。所以我最终以 JSON 格式返回数据。
JSON 只是我的 table 中的一列。我想弄清楚 "best practice" 是用来存储 JSON 字符串的。
首先我想到了用map类型,但是JSON里面混合了字符串,数值类型等等,好像不行声明地图 key/value 的通配符类型。 JSON 字符串可能非常大,可能超过 10KB。我可以将它存储为一个字符串,但看起来效率很低。我认为这是一项常见任务,因此我确信有一些关于如何执行此操作的一般准则。
我知道 Cassandra 原生支持 JSON,但据我了解,这主要用于整个 JSON 映射与数据库模式 1-1 匹配时。我不是这样的。该模式有一堆列,JSON 字符串只是一种 "payload"。将 JSON 字符串存储为 blob 还是 text 更好?顺便说一句,Cassandra 版本是 2.1.5.
感谢任何提示。提前致谢。
这取决于你想如何查询JSON。有 3 种可能的策略:
- 存储为字符串
- 存储为压缩的 blob
- 存储为 blob
选项 1 的优点是当您使用 cqlsh 在命令行上查询数据时,或者如果您想直接实时调试数据时,人类可读。缺点是这个 JSON 列的大小 (10k)
选项 2 的优点是可以保持较小的 JSON 负载,因为文本元素具有相当不错的压缩率。缺点是:你需要照顾 compression/decompression 客户端和 b。它不是人类直接可读的
选项 3 具有选项 1(大小)和选项 2(不可读)的缺点
在 Cassandra 存储引擎中,blob 和文本之间确实没有太大区别,因为 Cassandra 本质上将文本存储为 blob。是的,您所说的 "native" JSON 支持仅适用于您的数据模型与您的 JSON 模型匹配的情况,并且仅适用于 Cassandra 2.2+。
我会将其存储为文本类型,您在发送数据(或处理解压缩)时不必执行任何压缩 JSON 数据的操作。由于 Cassandra 的二进制协议支持使用相同的压缩算法执行 transport compression. Also make sure your table is storing the data compressed(我建议使用 LZ4,因为它是最快的算法实现)以节省为每个读取请求执行压缩。因此,如果您配置存储压缩数据并使用传输压缩,您甚至不必自己实施。
您没有说明您使用的是哪个客户端驱动程序,但这里是关于如何为 Datastax Java Client Driver.
设置传输压缩的文档