轻松应对多层JSON数据计算与入库

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介:

JSON作为一种轻量级的数据交换格式,因其易于读写和交互的特点,已逐渐成为主流的数据类型之一。常见的编程语言大多都对 JSON 的读取与解析提供了接口,但是接下来如何把多层 JSON 数据经过筛选、计算并展开成二维数据,就需要开发人员去头疼了。本文就为大家分享一下如何利用集算器 SPL(结构化处理语言)轻松解决 JSON 数据解析入库的问题。

JSON 数据文件导入与解析

根据 JSON 数据文件的复杂程度,以及不同的需求,我们会分三种情况来讨论:

  1. 单层的 JSON 数据文件

我们先从一个简单的例子入手,看看普通键值映射的 JSON 文件如何读取。下面是某产品订单信息的 JSON 数据文件:
11

SPL导入 JSON 数据文件只需要简单的一句脚本:
0

不需要写循环函数,也不用解析 JSON 对象,执行一下就可以看到,JSON 数据文件已经转换为二维数据序表了:
22

  1. 明细数据相同结构的多层 JSON 数据文件

接下来,我们看一下多层的 JSON 文件如何处理。下面是我们要用到的 JSON 数据文件 orders.json:
33

可以看到,JSON 数据分为两层,第一层是 "货主国家" 和 "货主地区",第二层是明细数据。现在我们想要从中导入中国华北和华南地区 2013 年的订单,让我们看看如果用 SPL 实现。

这次我们先来定义一下参数:Country、Area 和 Year,分别对应需要导入的货主国家、货主地区和订购日期的年份。通过定义参数,以后导入不同国家、地区和年份的时候,就不再需要修改 SPL,只需要提供相应的参数值就行了。这里需要注意的是,Area 的值是序列,默认值是 [华北, 华南],这样就可以同时读取多个地区的数据。如下图:
44

我们先看一下 SPL 脚本:
1

下面来详细解释一下:

第一步:A1 中 =json(file("orders.json").read()),导入 JSON 文件生成序表。执行一下,可以看到 JSON 数据按层级被展现出来(在集算器设计器中我们可以通过双击“区域订单”值,来查看下一层明细数据):
55

第二步:从图中可以看到,"货主国家" 和 "货主地区" 字段就在第一层,因此在 B1 中直接调用A1.select(货主国家 ==Country && Area.contain( 货主地区)) 就可以筛选出中国华北和华南的数据。

第三步:"区域订单" 是我们想要的明细数据,但是其中不包含 "货主国家" 和 "货主地区" 这两个字段,因此我们需要把这两个字段和区域订单的明细字段拼在一起。这么复杂的需求通过 news 函数就可以一步到位解决。从 A2 格的表达式可以看到参数并不复杂,把 B1. 货主国家,B1. 货主地区和 "区域订单" 的全部字段拼在一起就可以了。看下执行结果:
66

第四步:在 B2 中通过=A2.select(year( 订购日期)==Year)筛选出 "订购日期" 的年份是 2013 年的数据。

最后让我们执行一下,可以看到最终得到的二维表完全符合需求:
77

  1. 明细数据不同结构的多层 JSON 数据文件

因为数据来源的复杂性,JSON 数据文件的明细数据有可能是不同结构的,我们一起看一下这种 JSON 文件如何处理。下面是我们要用到的 JSON 文件 sales.json:
88

第一层以年和月为维度,第二层以国家为维度,第三层是明细数据。但是明细数据中,由于销售渠道不同,结构是不完全一致的,比如 "PRODUCTLINE"、"ADDRESSLINE1"、"ADDRESSLINE2" 在明细数据中并不是必须的。现在,我们要从数据中读取 2017 和 2018 年北美两个大国美国和加拿大的销售数据。

为了使用方便,我们还是先定义两个参数:Year 和 Country:
99

接下来先看一下 SPL:
2

下面来详细解释一下。

A1格还是把 JSON 文件导入为多层序表。

由于年份字段就在第一层,B1 格中直接调用A1.select(Year.contain(YEAR))可以从 A1 中筛选出 2017 和 2018 年份的数据:
10

接下来 A2 格中我们再次用到了 news 函数,用来把年月字段和下一层的月销售明细拼在一起:
101

B2格中我们通过A2.select(Country.contain(COUNTRY))从中筛选出来美国和加拿大的数据。

然后在 A3 格中,我们再次用到了 news 函数,这次需要把 YEAR,MONTH,COUNTRY 和再下一层的国家月销售明细拼在一个序表中。由于这个文件中明细数据可能结构有所不同,我们使用全量的字段名作为参数来创建序表。字段的值会根据名称设置,无此字段的会缺省为空值(例如下图 "ADDRESSLINE1" 和 "ADDRESSLINE2" 字段):
12

执行后可以看到最终结果:
13

至此,一个多层结构的明细数据结构不完全一致的 JSON 文件就成功展开成为一个二维表了。

**序表入库
**
前面介绍了常见的 JSON 数据文件导入与解析,接下来是数据入库的问题。之所以在最后才说入库,并不是因为复杂,恰恰相反的是,由于前面的例子中最后生成的都是序表,因此更新数据库就变得非常简单方便。以前面导入 JSON 的例子 2 中的订单表为例:
3

可以看到,更新数据库只需要一句脚本!

这里是比较常见的通过主键更新,用序表 A1 通过主键订单 ID 来更新数据库中的订单表。SPL 中的 update 函数有很多选项,可以满足更多的更新数据需求,这里就不再一一赘述了。

   因此,只要用对了工具,从 JSON 文件导入解析到数据入库,再繁琐的任务也可以轻松应对。除了 JSON 数据文件,集算器 SPL 还支持各种丰富多样的数据来源,后续将通过更多的文章继续分享给大家。

作者:WuNan
链接:http://c.raqsoft.com.cn/article/1536633176729
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
1天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
4月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
55 1
|
3月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
2月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
2月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
2月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
3月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
235 0
在Java中处理JSON数据:Jackson与Gson库比较
|
3月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
3月前
|
JSON 前端开发 Java
【Spring】“请求“ 之传递 JSON 数据
【Spring】“请求“ 之传递 JSON 数据
105 2
|
4月前
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据

热门文章

最新文章