当前位置: 首页 > 知识库问答 >
问题:

在Cassandra列中存储JSON字符串的有效方法?

辛承志
2023-03-14

卡桑德拉新手问题。我正在使用REST调用从社交网站收集一些数据。因此,我最终得到了以JSON格式返回的数据。

JSON 只是我的表中的列之一。我试图弄清楚存储JSON字符串的“最佳实践”是什么。

首先我想到使用map类型,但JSON包含字符串、数字类型等的混合。看起来我不能为map键/值声明通配符类型。JSON字符串可能非常大,可能超过10KB。我可以将其存储为字符串,但这似乎效率低下。我会假设这是一项常见的任务,所以我确信有一些通用的指导方针来指导如何做到这一点。

我知道Cassandra有对JSON的原生支持,但据我所知,这主要是在整个JSON映射与数据库模式一一匹配时使用的。对我来说不是这样。该模式有一堆列,JSON字符串只是一种“有效载荷”。将JSON字符串存储为blob还是文本更好?顺带一提,卡珊德拉版本是2.1.5。

任何提示都值得赞赏。提前致谢。

共有2个答案

罗淮晨
2023-03-14

这取决于如何查询您的JSON。有3种可能的策略:

  1. 存储为字符串
  2. 存储为压缩blob
  3. 存储为blob

当您使用cqlsh在命令行上查询数据时,或者如果您想要直接实时调试数据,选项1的优点是易于阅读。缺点是这个JSON列的大小(10k)

选项2具有保持JSON负载较小的优势,因为文本元素具有相当不错的压缩率。缺点是:a .你需要在客户端处理压缩/解压缩,b .它不是人类直接可读的

选项 3 具有选项 1(大小)和 2(非人类可读)的缺点

隆长卿
2023-03-14

在Cassandra存储引擎中,blob和文本没有太大的区别,因为Cassandra本质上是将文本存储为blob。是的,你所说的“原生”JSON支持只适用于当你的数据模型与你的JSON模型匹配时,而且只在Cassandra 2.2中。

我将把它存储为文本类型,在发送数据时(或处理解压缩),您不必实现任何压缩JSON数据的操作。因为Cassandra的二进制协议支持传输压缩。还要确保您的表存储的数据是用相同的压缩算法压缩的(我建议使用LZ4,因为它是实现速度最快的算法),以节省每个读取请求的压缩时间。因此,如果您配置存储压缩数据并使用传输压缩,您甚至不必自己实现。

您没有说明您正在使用哪个客户端驱动程序,但以下是有关如何为 Datastax Java 客户端驱动程序设置传输压缩的文档。

 类似资料:
  • 我想将 JSON 存储在卡桑德拉数据库中。JSON 的每个字段都应映射到其各自的列。 可能吗?如果可能的话,我如何才能实现它?。 请帮帮我..

  • 问题内容: 给我一个字符串,如果有一个或多个无效字符,则必须返回False,否则返回True。需要注意的是,我只能内置函数和str操作(例如:in,+,indexing,len)和递归。到目前为止,我没有用: 显然,由于递归,该代码无法正常工作,并且在下一次递归迭代之后才将变量加1 。 问题答案: 对于小尺寸(约一千个字符)的DNA序列,这是一个实际的实现 注意事项 在python中使用递归要小心

  • 给我一个字符串,如果有一个或多个无效字符,必须返回False,否则返回true。需要注意的是,我只能内置函数和字符串操作(例如:in,+,indexing,len)和递归。到目前为止,我所掌握的一切都不起作用: 显然,由于递归的原因,这段代码无法工作,在下一次递归迭代之后,将1添加到变量中会被删除。

  • 问题内容: 我正在编写一个小型JAVA程序,该程序: 将文本作为字符串 需要2个字符数组 我试图做的事情听起来像是“查找并替换”,但是并不相同,因此我认为清除它很重要。 无论如何,我想获取此文本,查找第一个数组中的任何字符是否与文本中的字符匹配,如果是,则将其替换为第二个字符数组中的匹配字符(根据索引)。 我将举一个例子来说明:假设我的文本(字符串)是:“ java很棒!”;我有2个数组(char

  • 我必须创建以下程序: 创建一个允许您键入名称的程序。用户键入并提交(使用enter键)的名称应存储在arraylist中。然后,arraylist中的名称应打印在屏幕上。 我的问题是,我只能在我的数组列表中存储一个名字。 我的代码: 第一个问题是,在键入一个名称并提交后,您不能键入任何内容,因此我必须重置输入,如使用整数值:

  • 在我的PostgreSQL中,我有两个表和tables,它们之间有 关系(一个 /code>可以有多个 )。 用户可以在棋盘上放几张牌。为了实现此功能,我通常会创建另一个名为< code>cards_on_hold的表,具有< code>OneToMany关系,并将保留卡id放入此表中。为了获取板的数据,我将使用< code>board和< code>cards_on_hold之间的JOIN。 P