嵌套的JSON数据与AVRO文件的相互转换
JSON是一种常用的数据交换格式,很多系统都会使用JSON作为数据接口返回的数据格式,然而,由于JSON数据中包含大量的字段名字,导致空间的严重浪费,尤其是数据文件较大的时候,而AVRO是一种更加紧凑的数据序列化系统,占用空间相对较少,更利于数据在网络当中的传输,本文介绍如何使用avro-tools工具对这两种文件格式进行转换。
准备转换工具
使用的是avro-tools-1.8.1.jar,可到官方网站下载。
准备嵌套的JSON数据
[
{"product_seris":"S_01","product_name":"iphone7","prices":[{"model":"iphone7","price":5200},{"model":"iphone7 plus","price":5800}]},
{"product_seris":"S_02","product_name":"iphone6","prices":[{"model":"iphone6","price":4600},{"model":"iphone6 plus","price":5200}]}
]
模拟数据,请忽略价格信息。以上内容保存为products.json.
准备schema
在对JSON数据转换成AVRO数据时,需要提供AVRO数据的schema,这个schema有些复杂,容易出错,特别是当JSON记录中有数组的情况。
{"type": "array",
"items":{
"type":"record",
"name":"products",
"fields": [
{"name": "product_seris", "type": "string"},
{"name": "product_name", "type": "string"},
{"name": "prices", "type":
{"type": "array",
"items":{
"type":"record",
"name" : "price",
"fields":[
{"name":"model","type":"string"},
{"name":"price","type":"float"}
]}
}
}
]
}
}
以上内容保存为products.avsc.
几点解释:
类型为array,因为从前面的JSON数据上可以看到,整个JSON数据是一个数组,因此,这里的类型为array,当类型为array时,必须指定items。
由于数组内部是记录形式,因此,在items里面的type是record,这里必须指定name和fields。
fields里的name必须与JSON数据里的字段名保持一致。
值得注意的是,从前面的JSON数据可以看到,prices信息为数组字段,因此,必须先指定name为prices,而且type是一个对象,并不能单纯地指定为array,而是需要在对象里再用一个type来指定array,然后再加上items。
嵌套的JSON数据转换成AVRO数据
java -jar avro-tools-1.8.1.jar fromjson products.json --schema-file products.avsc > products.avro
fromjson表示将JSON转换成AVRO。
--schema-file 后面跟上AVRO 的schema文件。
>表示重定向输出到文件products.avro,因为默认的是输出到控制台。
AVRO数据转换成相应的JSON数据
java -jar avro-tools-1.8.1.jar tojson products.avro
tojson 表示将AVRO数据转换成JSON数据。结果默认输出到控制台,也可使用重定向输出到文件。
转换结果如下:
[yang@master etl]$ java -jar avro-tools-1.8.1.jar tojson products.avro
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[{"product_seris":"S_01","product_name":"iphone7","prices":[{"model":"iphone7","price":5200.0},{"model":"iphone7 plus","price":5800.0}]},{"product_seris":"S_02","product_name":"iphone6","prices":[{"model":"iphone6","price":4600.0},{"model":"iphone6 plus","price":5200.0}]}]
参考文献:
[1] https://avro.apache.org/docs/current/spec.html
[2] https://avro.apache.org/docs/current/gettingstartedjava.html
[3] http://grokbase.com/t/avro/user/129hab256y/converting-arbitrary-json-to-avro
[4] http://stackoverflow.com/questions/22443051/avro-tools-json-to-avro-schema-fails-org-apache-avro-schemaparseexception-unde
嵌套的JSON数据与AVRO文件的相互转换相关推荐
- 7、JSON数据和Java对象的相互转换(客户端和服务器对象数据通讯用)
JSON数据和Java对象的相互转换 需要使用JSON解析器(它是封装好的工具类),我们测试用用jackson * 常见的解析器:Jsonlib,Gson(谷歌),fastjson(阿 ...
- 怎么把嵌套的json数据改为整齐的格式
如果要把嵌套的 JSON 数据转换为整齐的格式,可以使用 JSON 格式化工具.许多文本编辑器都支持对 JSON 文件的格式化,也可以使用在线的 JSON 格式化工具.如果要使用代码实现,可以使用 P ...
- 实体类多层嵌套 遍历_多层嵌套的json数据
很多时候我们见到的json数据都是多层嵌套的,就像下面这般: {"name":"桔子桑","sex":"男"," ...
- ajax 循环html元素,AJAX返回API数据并使用jQuery循环遍历嵌套的JSON数据
我使用AJAX连接到返回JSON对象的API(请参阅下面的JSON代码参考),并试图循环并解析要在HTML元素内部呈现的JSON数据.AJAX返回API数据并使用jQuery循环遍历嵌套的JSON数据 ...
- fastjson 修改多层嵌套的Json数据
文章目录 一.需求 二.期望效果 三.实现 四.总结 一.需求 操作多层嵌套的Json数据,修改key值或删除key,然后更新原始Json数据 二.期望效果 删除原始Json中query-->b ...
- java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)
2018.11.14日更新 前言 没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐 在这一个月的项目中,总是用到JSONMo ...
- JSON数据和Java对象的相互转换
* JSON解析器: * 常见的解析器:Jsonlib,Gson,fastjson,jackson 1. JSON转为Java对象 1. 导入jack ...
- Ajax(form表单文件上传、请求头之contentType、Ajax传递json数据、Ajax文件上传)
form表单文件上传 上菜 file_put.html <form action="" method="post" enctype="multi ...
- java json csv_彻底理解使用JavaScript 将Json数据导出CSV文件
前言 将数据报表导出,是web数据报告展示常用的附带功能.通常这种功能都是用后端开发人员编写的.今天我们主要讲的是直接通过前端js将数据导出Excel的CSV格式的文件. 原理 首先在本地用Excel ...
最新文章
- VMware对虚拟机快照进行克隆
- JavaWeb学习笔记28--Filter高级开发
- Android多线程
- Python中修改字符串的四种方法
- mycat 编辑schema.xml
- windows server 2003R2\2008R2\2012\2016 安装【故障转移群集】cluster
- Python Tricks(九)—— 递归遍历目录下所有文件
- JScript.NET(JScript 8.0)编程简介
- sleep方法和wait方法的区别?
- 数据库系统概论总结(第五版)
- 学会这几个简单的bat代码,轻松在朋友面前装一波13
- sl400通过ac无法连接psk加密无线网络
- 网络七层协议的通俗理解
- 《CLR via C#》读书笔记-.NET多线程(一)
- 西勒振荡电路------multisim仿真
- 计算机平时测试零分,计算机二级最全攻略 就快考试了不看等什么呢!
- 郭晶晶家的象棋私教,好家伙是个机器人
- 网络协议—三要素与五层网络协议
- 迷宫寻宝(一) 搜索
- Unity-URP学习笔记(三)赛璐珞阴影
热门文章
- 云服务器转租赁协议,关于云服务器的租赁协议
- android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探
- linux mysql temp 设置_linux上mysql的简单入门
- 利用Java实现串口全双工通讯
- 效率 每秒_每秒看懂超过5.3亿张图片!异构计算是如何发挥AI效率的?
- node.js 执行php,node.js - 如何利用php执行nodejs文件
- ajax拿table里的th值,Jquery Ajax 异步设置Table中某列的值
- java 获取spring对象数组_解析Java中如何获取Spring中配置的bean
- 安装mysql查看随机密码命令_linux安装mysql-8.0.21-1.el7.x86_64.rpm-bundle - 君主-bye
- python统计字典里面value出现的次数_python统计字典中元素出现的次数