如何存储数十亿 JSON 文件并进行查询
Posted
技术标签:
【中文标题】如何存储数十亿 JSON 文件并进行查询【英文标题】:How to store billions of JSON files and query them 【发布时间】:2013-02-08 14:44:33 【问题描述】:我目前有一个 API,它接受 JSON 文件(它们是 JSON 序列化对象,包含一些用户事务数据)并将其存储到服务器中。每个这样的 JSON 文件都有一个唯一的全局 id 和一个与之关联的唯一用户。每天都会生成数十亿个这样的文件。然后,用户应该能够查询与他关联的所有 JSON 文件,并生成一堆在这些文件之上计算的聚合结果。
需要存储的典型 JSON 文件如下所示:
[ "currencyCode" : "INR",
"receiptNumber" : "value" : "1E466GDX5X2C" ,
"retailTransaction" : [ "grandTotal" : 90000.0,
"lineItem" : [ "otherAttributes" : ,
"sale" : "description" : "Samsung galaxy S3",
"discountAmount" : "currency" : "INR",
"value" : 2500
,
"itemSubType" : "SmartPhone",
"otherAttributes" : ,
"unitCostPrice" : "quantity" : 1,
"value" : 35000
,
"sequenceNumber" : 1000
,
"customerOrderForPickup" : "description" : "iPhone5",
"discountAmount" : "currency" : "INR",
"value" : 5000
,
"itemSubType" : "SmartPhone",
"otherAttributes" : ,
"unitCostPrice" : "quantity" : 1,
"value" : 55000
,
"otherAttributes" : ,
"sequenceNumber" : 1000
],
"otherAttributes" : ,
"reason" : "Delivery",
"total" : [ "otherAttributes" : ,
"type" : "TransactionGrossAmount",
"value" : 35000
]
,
null
],
"sequenceNumber" : 125435,
"vatRegistrationNumber" : "10868758650"
]
上面的 JSON 是一个复杂对象的序列化版本,它包含单个或其他类的对象数组作为属性。所以 'receiptNumber' 是 JSON 文件的通用 id。
我需要查询诸如 customerOrderForPickup 的数量和价值或交易的总金额之类的东西,并作为各种此类交易 JSON 的集合**
我想对如何进行一些建议:1)将这些 JSON 文件存储在服务器上,即文件系统上 2)我应该使用什么样的数据库来查询这些 JSON 文件结构复杂
我的研究产生了两种可能性:1) 使用 MongoDB 数据库来存储对象的 JSON 代表并通过数据库进行查询。 JSON 文件将如何存储?将事务 JSON 存储在 MongoDB 数据库中的最佳方式是什么? 2) 将包含唯一全局 ID、用户 ID 和服务器上 JSON 文件地址的 SQL 数据库与这些文件上的聚合代码结合起来。我怀疑这是否可以缩放
如果有人对这个问题有任何见解,我会很高兴。谢谢。
【问题讨论】:
您是否考虑过基于此源数据构建维度数据集市? MongoDB 中基于 JSON 的分析令人沮丧。这看起来像是来自事务处理系统的结果。关系/维度数据库多年来一直很好地完成此类工作。 这可能是一个不错的方法,但是随着数据集市的属性(例如,我们添加更多统计度量)不断增加,您不认为它会带来问题吗? 每天有数十亿的条目?是不是打错字了? 你考虑过 CouchDB 吗?它是一个文档数据库,其中文档是 JSON 对象。听起来可能是相关的;) 关系数据库可以处理数十亿行的分析,如果你有一个好的数据模型和硬件来处理它。 Teradata、Vertica、Netezza 等围绕处理大量关系数据建立了整个业务。考虑到对 ACID 的需求,像 Mongo 或 Hadoop 这样的工具不一定具有吸引力。 【参考方案1】:我想说您的问题非常笼统,实际上是风格和偏好问题。你可以用 10 种不同的方式做到这一点,而且每一种都非常好。
我将给出我的个人偏好以及我会如何做:
由于有很多数据,我会使用关系数据库 - SQL Server。因为我喜欢 Microsoft 工具和 ASP MVC(我知道有很多人不喜欢,但这是我的偏好),并且它有一个序列化程序,可以将 JSON 转换为 c# 对象。由于我也喜欢使用实体框架,并且实体框架可以将 c# 对象转换为数据库内容,因此我只需按照我的 JSON 对象的外观来构建数据库。然后我会有一个接受这些 JSON 实体的 api,ASP MVC 会自动将它们转换为 c# 对象,而实体框架会自动将它们转换为数据库行。这样一来,整个上传 API 只需几行代码即可完成。
然后我会为不同类型的数据查询创建更多 API 方法。 Linq 和实体框架有时使不同的查询像一行代码一样简单。
【讨论】:
Dennis,这适用于像上面这样的复杂对象 JSON 表示吗? JSON 序列化对象(即要存储的文件)包含对象数组作为属性。 是的,我在生产中使用它来处理具有相似复杂性的对象,甚至更复杂的东西,我对数组的深度很少,它工作得很好。我不确定 ASP MVC 对如此大的数据集(数十亿个文件 :) 的性能有多好,因为我对这么大的数据集没有第一手经验。 如果确实有数十亿个事务,那么可能需要使用一种更快的方法来解析数据,而不是通过框架一次将数据加载到数据库中。从分析的角度来看,批量处理事务以消除上下文切换更有意义。以上是关于如何存储数十亿 JSON 文件并进行查询的主要内容,如果未能解决你的问题,请参考以下文章
[ElasticSearch] ElasticSearch在数十亿级别数据下,如何提高查询效率?
ElasticSearchElasticSearch在数十亿级别数据下,如何提高查询效率? 性能优化