kettle庖丁解牛第14篇之JSON输入
Posted 飞哥大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kettle庖丁解牛第14篇之JSON输入相关的知识,希望对你有一定的参考价值。
引言
上一篇文章中,我们介绍了:XML和XPath的那些事,然后又讲解了XML文件输入组件的各种详细设置,最后实战演示了如何操作它来读取磁盘上的xml文件。
在本篇文章中,我们接着介绍:kettle中的JSON输入组件(JSON inpu)。
要想学明白JSON输入组件,我们就要扩展着聊聊JSON和JSONPath那些事了。
JSON简介
JSON的全称是"javascript Object Notation",意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?
因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以更倾向于选择JSON来交换数据。
JSON3种数据结构
键值对
键值对是JSON中最基本的数据结构
"Name": "大飞哥"
在上面的例子中属性"Name"是用一对双引号括起来的一个字符串。而它的值"大飞哥"在这个例子中也是一个字符串,当然它还可以是其他类型。
对象
一个JSON对象是包含了一组未排序键值对的集合。
"person" :
"age" : "35",
"sex" : "男",
"name" : "大飞哥",
"weight" : "75kg",
"height" : "170cm"
上面的例子中person对象包含了5个属性,它们之间用,进行分割。
数组
JSON中用[]来表示数组元素
"people" : [
"firstName": "大", "lastName": "飞哥", "age": 35 ,
"firstName": "大", "lastName": "数据", "age": 32
]
JSON6种数据类型
string类型
字符串,必须要用双引号引起来。
number类型
数值,与JavaScript的number一致,整数(不使用小数点或指数计数法)最多为15位,小数的最大位数是17。
object类型
JavaScript的对象形式, key:value表示方式,可嵌套。
array类型
数组,JavaScript的Array表示方式[value],可嵌套。
布尔类型
true/false,JavaScript的boolean类型。
null类型
空值,JavaScript的null。
JSON的优缺点
优点
a、数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
b、易于解析,客户端JavaScript可以通过eval()进行JSON数据的读取;
c、支持多种语言,便于服务器端的解析;
d、直接为服务器端代码使用,简化服务器端和客户端的代码开发量,并且易于维护。
缺点
a、没有XML格式推广的好,没有XML那么通用性;
b、JSON格式目前在Web Service中,推广还属于初级阶段。
JSON相关网址
json中文官网
http://www.json.org/json-zh.html
json官网
http://www.json.org/
JSONPath那些事
JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和php,Java。
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有想要获得的json内容。
操作符
操作 | 说明 |
$ | 查询根元素。这将启动所有路径表达式。 |
@ | 当前节点由过滤谓词处理。 |
* | 通配符,必要时可用任何地方的名称或数字。 |
.. | 深层扫描。 必要时在任何地方可以使用名称。 |
.<name> | 点,表示子节点 |
[<name> (, <name>)] | 括号表示子项 |
[<number> (, <number>)] | 数组索引或索引 |
[start:end] | 数组切片操作 |
[?(<expression>)] | 过滤表达式。 表达式必须求值为一个布尔值。 |
函数
可以在路径的尾部调用,函数的输出是路径表达式的输出,该函数的输出是由函数本身所决定的。
函数 | 描述 | 输出 |
min() | 提供数字数组的最小值 | Double |
max() | 提供数字数组的最大值 | Double |
avg() | 提供数字数组的平均值 | Double |
stddev() | 提供数字数组的标准偏差值 | Double |
length() | 提供数组的长度 | Integer |
过滤器运算符
过滤器是用于筛选数组的逻辑表达式。
操作符 | 描述 |
== | left等于right(注意1不等于1) |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
=~ | 匹配正则表达式[?(@.name =~ /foo.*?/i)] |
in | 左边存在于右边 [?(@.size in [S, M])] |
nin | 左边不存在于右边 |
size | (数组或字符串)长度 |
empty | (数组或字符串)为空 |
JSONPath使用举例
JSON原数据
[
"id": "PRIMARY",
"name": "小学",
"front_id": "PRIMARY",
"front_name": "小学"
,
"id": "JUNIOR",
"name": "初中",
"front_id": "JUNIOR",
"front_name": "初中"
,
"id": "HIGH",
"name": "高中",
"front_id": "HIGH",
"front_name": "高中"
,
"id": "TECHNICAL",
"name": "中专/技校",
"front_id": "TECHNICAL",
"front_name": "中专/技校"
,
"id": "COLLEGE",
"name": "大专",
"front_id": "COLLEGE",
"front_name": "大专"
,
"id": "BACHELOR",
"name": "本科",
"front_id": "BACHELOR",
"front_name": "本科"
,
"id": "MASTER",
"name": "硕士",
"front_id": "MASTER",
"front_name": "硕士"
,
"id": "DOCTOR",
"name": "博士",
"front_id": "DOCTOR",
"front_name": "博士"
]
JSONPath获取数据
JSONPath表达式 | 结果 |
$.[*].name | 所有学历的name |
$.[*].id | 所有的id |
$.[*] | 所有元素 |
$.[(@.length-2)].name | 倒数第二个元素的name |
$.[2] | 第三个元素 |
$.[(@.length-1)] | 最后一个元素 |
$.[0,1] $.[:2] | 前面的两个元素 |
$.[?(@.name =~ /.*大专/i)] | 过滤出所有的name包含“大专”的。 |
$.[*].length() | 所有元素的个数 |
JSON和JSONPath的讲解,主要为了我们下面要讲的JSON input做铺垫,我们走起来吧!
转换
转换(transaformation)是ETL解决方案中最主要的部分,它处理抽取、转换、加载各种对数据行的操作。
创建转换
我们要做的ETL操作,全是在转换中设计的,所以我们要先创建一个转换。
保存转换
给你新建的转换,起个名字,并保存
JSON输入
此组件可以实现,从指定的JSON文件输入数据。
a、文件指定
1、文件标签指定数据源文件,点击“浏览”按钮,浏览本地的json文件。点击"增加"按钮,你可以添加一个文件到"选择文件"中,如下所示:
选项说明
选项 | 描述 |
源定义在一个字段里 | 选择从前面定义的字段检索源。选择后,设置一下字段可用:Select field(从字段获取源)、Use field as file names(源是一个文件名?)、Read source as URL(以Url获取源?)、Do not pass field downstream。当这个选项禁用,以下字段是可用:File or directory(文件或路径)、Regular Expression(正则表达式)、Exclude Regular Expression(正则表达式(排除))、Selected files(选中的文件)。 |
从字段获取源 | 在前面的步骤中指定要用作源的字段名。 |
源是一个文件名 | 选中表示源是文件名。 |
以Url获取源 | 选中表示是否应该以URL的形式访问源。 |
Do not pass field downstream | 选择将源字段从输出流中移除。此操作提高了大型JSON字段的性能和内存利用率。 |
文件或路径 | 如果源未在字段中定义,请指定源位置。单击浏览(B)导航到源文件或目录。单击增加(A)以在选中的文件列表中包含源。 |
正则表达式 | 指定一个正则表达式来匹配指定目录中的文件名。 |
正则表达式(排除) | 指定一个正则表达式以排除指定目录中的文件名。 |
b、内容
选项说明
选项 | 描述 |
忽略空文件 | 选择跳过空文件。清除后,空文件将导致进程失败并停止。 |
如果没有文件不要报告错误 | 当没有文件可供处理时,选择继续。 |
忽略不完整的路径 | 当出现错误(1)没有字段匹配JSON路径或(2)所有值都为null时,选择继续处理文件。清除后,发生错误时不再处理其他行。 |
Default path leaf to null | 如果选中,为缺少的路径返回一个null值。 |
以上是关于kettle庖丁解牛第14篇之JSON输入的主要内容,如果未能解决你的问题,请参考以下文章 |