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

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

 

 

JSON 数据文件导入与解析编程

根据 JSON 数据文件的复杂程度,以及不一样的需求,咱们会分三种状况来讨论:json

 

1. 单层的 JSON 数据文件数据结构

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

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

= json(file("product.json").read())工具

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

 

2. 明细数据相同结构的多层 JSON 数据文件设计

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

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

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

咱们先看一下 SPL 脚本:

 

A

B

1

=json(file("orders.json").read())

=A1.select(货主国家 ==Country   && Area.contain( 货主地区))

2

=B1.news(区域订单;B1. 货主国家: 货主国家,B1. 货主地区: 货主地区,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13)

=A2.select(year( 订购日期)==Year)

下面来详细解释一下:

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

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

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

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

最后让咱们执行一下,能够看到最终获得的二维表彻底符合需求:

 

3. 明细数据不一样结构的多层 JSON 数据文件

由于数据来源的复杂性,JSON 数据文件的明细数据有多是不一样结构的,咱们一块儿看一下这种 JSON 文件如何处理。下面是咱们要用到的 JSON 文件 sales.json:

第一层以年和月为维度,第二层以国家为维度,第三层是明细数据。可是明细数据中,因为销售渠道不一样,结构是不彻底一致的,好比 "PRODUCTLINE"、"ADDRESSLINE1"、"ADDRESSLINE2" 在明细数据中并非必须的。如今,咱们要从数据中读取 2017 和 2018 年北美两个大国美国和加拿大的销售数据。

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

接下来先看一下 SPL:

 

A

B

1

=json(file("sales.json").read())

=A1.select(Year.contain(YEAR))

2

=B1.news(MONTHLY_SALES;B1.YEAR:YEAR,B1.MONTH:MONTH,#1,#2)

=A2.select(Country.contain(COUNTRY))

3

=B2.news(NATIONAL_MONTHLY_SALES;B2.YEAR:YEAR,B2.COUNTRY:COUNTRY,ORDERNUMBER,QUANTITYORDERED,PRICEEACH,ORDERLINENUMBER,SALES,ORDERDATE,STATUS,QTR_ID,PRODUCTLINE,MSRP,PRODUCTCODE,CUSTOMERNAME,PHONE,ADDRESSLINE1,ADDRESSLINE2,CITY,STATE,POSTALCODE,TERRITORY,CONTACTLASTNAME,CONTACTFIRSTNAME,DEALSIZE)

 

下面来详细解释一下。

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

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

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

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

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

执行后能够看到最终结果:

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

 

序表入库

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

 

A

1

=file("orders.json").read().import@j().select(货主国家 ==Country && 货主地区 ==Area). 区域订单.select(year( 订购日期)==Year).derive(Country: 货主国家,Area: 货主地区)

2

=connect("demo").update(A1, 订单; 订单 ID)

能够看到,更新数据库只须要一句脚本!

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

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


更多精彩内容,详情请看原文阅读

相关文章
相关标签/搜索