【问题标题】:Storing large amounts of queryable JSON存储大量可查询的 JSON
【发布时间】:2019-04-01 05:10:26
【问题描述】:

我正在尝试寻找能够实现以下功能的数据库解决方案。

  1. 存储由表名分隔的平面、随机 JSON 结构(例如 random_json_table_1、random_json_table_2)。
  2. 能够处理大量插入操作(+10000/秒)。
  3. 能够查询随机 json 结构(SELECT * FROM random_json_table_1 WHERE JSON_SELECT('data', '$.city.busses') NOT NULL AND JSON_SELECT('data', '$.city.busStops', 'length' ) > 5) 例如。
  4. SELECT 查询必须在千兆字节的数据上快速运行。

我查看了 Amazon Athena,它看起来很有希望,但我很好奇是否还有其他解决方案。

【问题讨论】:

  • 您能否澄清一下进入给定表的 JSON 记录是否都具有相同的对象结构?如果是这样,那么 Google BigQuery 就是一个候选者......请参阅 cloud.google.com/bigquery/docs/loading-data-cloud-storage-json
  • 表的结构是一样的,例如... id, organization_id, json_data 但是json_data的内容是随机的。

标签: json database amazon-web-services google-cloud-platform nosql


【解决方案1】:

您可以考虑使用 BigQuery。 关于2),有BigQuery streaming接口。 并且 4),您可以使用 BigQuery 公共数据(例如流行的比特币交易表)来查看 BigQuery 的速度。

以下是使用 BigQuery 标准 SQL 的示例查询,展示了如何过滤存储在 JSON 字符串中的数据。

#standardSQL
SELECT JSON_EXTRACT(json_text, '$') AS student
FROM UNNEST([
  '{"age" : 1, "class" : {"students" : [{"name" : "Jane"}]}}',
  '{"age" : 2, "class" : {"students" : []}}',
  '{"age" : 10,"class" : {"students" : [{"name" : "John"}, {"name": "Jamie"}]}}'
  ]) AS json_text
WHERE CAST(JSON_EXTRACT_SCALAR(json_text, '$.age') AS INT64) > 5;

【讨论】:

  • 我最终想出了办法,我发现大多数示例都难以理解,因为它们没有使用实际的表格。
  • 如果您询问有关 BigQuery 的问题,人们通常会给您一个 answer with a query based on public data,或者一个包含数据的独立查询,例如我的或 another example
【解决方案2】:

感觉 Google 的 BigQuery 托管数据库可能对您很有价值。阅读here,我们似乎发现每秒有 100,000 行的软限制,并且每个请求可以插入 10,000 行。对于执行查询,BigQuery 宣传自己能够在可接受的范围内处理 PB 大小的表。

这是 BigQuery 主页的链接:

https://cloud.google.com/bigquery/

【讨论】:

  • 我认为 Google Bigquery 缺乏 JSON 过滤选择查询的要求?
  • 如果我们将 JSON 视为专门用于描述传输数据的编码,那么当我们将数据引入 BQ 时,BQ 将以自己的内部格式存储数据。我相信 BQ 可以摄取 JSON 编码的数据,结果将是包含行的表,其中每行对应于输入 JSON 文档/记录。从那里我们可以执行 SQL 查询来查找与我们的查询匹配的行。您能否详细说明您可能需要/期望的这个故事中缺少什么?
  • 所以给你一个例子SQL查询。
  • SELECT * FROM random_json_table_1 WHERE JSON_SELECT('data', '$.city.busses') NOT NULL AND JSON_SELECT('data', '$.city.busStops', 'length') > 5
  • 表格结构应该是这样的。 ID(数字)、ORGANISATION_ID(数字)、数据(字符串/JSON)。我想根据 DATA 列包含的内容进行过滤。
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2016-07-11
  • 2016-11-02
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多