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文件的相互转换相关推荐

  1. 7、JSON数据和Java对象的相互转换(客户端和服务器对象数据通讯用)

    JSON数据和Java对象的相互转换 需要使用JSON解析器(它是封装好的工具类),我们测试用用jackson         * 常见的解析器:Jsonlib,Gson(谷歌),fastjson(阿 ...

  2. 怎么把嵌套的json数据改为整齐的格式

    如果要把嵌套的 JSON 数据转换为整齐的格式,可以使用 JSON 格式化工具.许多文本编辑器都支持对 JSON 文件的格式化,也可以使用在线的 JSON 格式化工具.如果要使用代码实现,可以使用 P ...

  3. 实体类多层嵌套 遍历_多层嵌套的json数据

    很多时候我们见到的json数据都是多层嵌套的,就像下面这般: {"name":"桔子桑","sex":"男"," ...

  4. ajax 循环html元素,AJAX返回API数据并使用jQuery循环遍历嵌套的JSON数据

    我使用AJAX连接到返回JSON对象的API(请参阅下面的JSON代码参考),并试图循环并解析要在HTML元素内部呈现的JSON数据.AJAX返回API数据并使用jQuery循环遍历嵌套的JSON数据 ...

  5. fastjson 修改多层嵌套的Json数据

    文章目录 一.需求 二.期望效果 三.实现 四.总结 一.需求 操作多层嵌套的Json数据,修改key值或删除key,然后更新原始Json数据 二.期望效果 删除原始Json中query-->b ...

  6. java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)

    2018.11.14日更新 前言 没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐 在这一个月的项目中,总是用到JSONMo ...

  7. JSON数据和Java对象的相互转换

    * JSON解析器:         * 常见的解析器:Jsonlib,Gson,fastjson,jackson          1. JSON转为Java对象         1. 导入jack ...

  8. Ajax(form表单文件上传、请求头之contentType、Ajax传递json数据、Ajax文件上传)

    form表单文件上传 上菜 file_put.html <form action="" method="post" enctype="multi ...

  9. java json csv_彻底理解使用JavaScript 将Json数据导出CSV文件

    前言 将数据报表导出,是web数据报告展示常用的附带功能.通常这种功能都是用后端开发人员编写的.今天我们主要讲的是直接通过前端js将数据导出Excel的CSV格式的文件. 原理 首先在本地用Excel ...

最新文章

  1. VMware对虚拟机快照进行克隆
  2. JavaWeb学习笔记28--Filter高级开发
  3. Android多线程
  4. Python中修改字符串的四种方法
  5. mycat 编辑schema.xml
  6. windows server 2003R2\2008R2\2012\2016 安装【故障转移群集】cluster
  7. Python Tricks(九)—— 递归遍历目录下所有文件
  8. JScript.NET(JScript 8.0)编程简介
  9. sleep方法和wait方法的区别?
  10. 数据库系统概论总结(第五版)
  11. 学会这几个简单的bat代码,轻松在朋友面前装一波13
  12. sl400通过ac无法连接psk加密无线网络
  13. 网络七层协议的通俗理解
  14. 《CLR via C#》读书笔记-.NET多线程(一)
  15. 西勒振荡电路------multisim仿真
  16. 计算机平时测试零分,计算机二级最全攻略 就快考试了不看等什么呢!
  17. 郭晶晶家的象棋私教,好家伙是个机器人
  18. 网络协议—三要素与五层网络协议
  19. 迷宫寻宝(一) 搜索
  20. Unity-URP学习笔记(三)赛璐珞阴影

热门文章

  1. 云服务器转租赁协议,关于云服务器的租赁协议
  2. android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探
  3. linux mysql temp 设置_linux上mysql的简单入门
  4. 利用Java实现串口全双工通讯
  5. 效率 每秒_每秒看懂超过5.3亿张图片!异构计算是如何发挥AI效率的?
  6. node.js 执行php,node.js - 如何利用php执行nodejs文件
  7. ajax拿table里的th值,Jquery Ajax 异步设置Table中某列的值
  8. java 获取spring对象数组_解析Java中如何获取Spring中配置的bean
  9. 安装mysql查看随机密码命令_linux安装mysql-8.0.21-1.el7.x86_64.rpm-bundle - 君主-bye
  10. python统计字典里面value出现的次数_python统计字典中元素出现的次数