[杂谈] 大型 JSON 数据切分 (Java Jackson)
介绍
最近遇到一个需求,期望将一个大型的 json 文件存储至 Elasticsearch 中,第一反应是期望将原始数据进行拆分,这样就可以在受限的内存空间中完成数据的导入。
思路
本文使用 JAVA 语言进行切分,并且使用 jackson 组件。 对 JSON 数据进行处理,首先想到的进行 反序列化 操作,但是这样的话,会将所有数据同时存储在内存中,在受限内存的环境下并不友好,故放弃此方法。 改为使用 JsonParser 这个更底层的解析类进行数据处理,在设置 -Xmx10M 参数的前提下,能够正常解析 180M 的一个 JSON 文件。
代码
分为四个例子,进行递进的理解
代码一:使用 JsonParser 解析 JSON,根节点是对象。
代码二:使用 JsonParser 解析 JSON,根节点是数组
代码三:使用 JsonParser 切分 JSON,根节点是数组
代码三使用的 json 数据同代码二一样,不同之处在于按照对象进行解析,便于后续的 json 结构切分。
代码四:使用 JsonParser 切分 JSON,根节点是数组
大小为180M的JSON文件,使用互联网上的大型 JSON 文件,并对其进行解析,为切分做准备 注意在进行解析的时候,增加了针对 BigDecimal 数据的处理,从而避免了精度丢失。 按照代码逻辑,features 数组下的数据按照对象进行输出,从而就可以根据切分规则进行切分。 比如定义一个 ListtmpList = new ArrayList<>(); 将 ObjectNode node 对象添加进来,就可以理解为切分后的对象。
总结
将大量数据切分为相同结果的多组小数据,从而可以进行并行处理;
参考
https://stackoverflow.com/questions/24835431/use-jackson-to-stream-parse-an-array-of-json-objects
https://blog.csdn.net/weixin_42338707/article/details/111296652
https://github.com/zemirco/sf-city-lots-json/blob/master/citylots.json
版权声明: 本文为 InfoQ 作者【alexgaoyh】的原创文章。
原文链接:【http://xie.infoq.cn/article/e10ae7c1b2cb7d95e3128aff8】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论