首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 JAQL 语言读写大数据文件(3)

使用 JAQL 语言读写大数据文件(3)

一行为一条 JSON 格式记录在实际应用的过程中,我们还会遇到这样的文件:每一行是一个独立的 JSON 格式记录,而文件的整体并不满足 JSON 格式的要求。给出一个实例文件 jsonline.txt,如清单 6 所示:
清单 6. 一行为一条 JSON 记录的文本文件
1
2
3
4
> cat jsonline.txt
{"name": "Tom", "sex": "man", "age": "23", "occupation": "student"}
{"name": "Alice", "sex": "femal", "age": "35", "occupation": "teacher"}
{"name": "Ben", "sex": "male", "age": "33", "occupation": "police"}




可以看到,每一行都是一个标准格式的 JSON 记录,而整个文档并不满足 JSON 的格式要求。
因此,我们不能简单的使用 jsonTextFile() 或 seq() 来读取。和之前读取 CSV 文件一样,需要使用 lines() 函数现将每一行读取,然后再对每一行进行分别处理。以下给出了一个示例,通过对清单 6 所示文件的读取,来阐述如何读取此类文件。
首先,当使用 lines() 函数读取时,可以将每一行读入到一个 string 的记录中,如清单 7 所示:
清单 7. 使用 lines() 函数读取 JSON 文件
1
2
3
4
5
6
jaql> read(lines('file:///xvdc/gaoyunhe/develop/jsonline.txt'));
[
"{\"name\": \"Tom\", \"sex\": \"man\", \"age\": \"23\", \"occupation\": \"student\"}",
"{\"name\": \"Alice\", \"sex\": \"femal\", \"age\": 35\", \"occupation\": \"teacher\"}",
"{\"name\": \"Ben\", \"sex\": \"male\", \"age\": \"33\", \"occupation\": \"police\"}"
]




而仅仅读入并不是我们需要的,我们需要读入为 JSON 的格式,因此我们需要添加 transform 操作来将每一行转换为 JSON 格式。这里用到了 json() 函数。如清单 8 示例:
清单 8. 将读取的文件转换成 JSON 格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
jaql> read(lines('file:///xvdc/gaoyunhe/develop/jsonline.txt')) -> transform json($);
[
{
"age": "33",
"name": "Ben",
"occupation": "police",
"sex": "male"
},
{
"age": "23",
"name": "Tom",
"occupation": "student",
"sex": "man"
},
{
"age": "35",
"name": "Alice",
"occupation": "teacher",
"sex": "femal"
}
]




同样的,为了避免原始文件中的空行或错误的 JSON 记录导致程序终止,需要 catch 错误。当我们给 jsonline.txt 文件添加空行和错误行后,需要修改代码如清单 9 所示:
清单 9. 包含容错的 JSON 格式文件读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
jaql> read(lines('file:///xvdc/gaoyunhe/develop/jsonline.txt')) ->
transform catch( json($), {errThresh: 3} , $) -> filter not(isnull($));
[
{
"age": "33",
"name": "Ben",
"occupation": "police",
"sex": "male"
},
{
"age": "23",
"name": "Tom",
"occupation": "student",
"sex": "man"
},
{
"age": "35",
"name": "Alice",
"occupation": "teacher",
"sex": "femal"
}
]




以上描述的文件都是文本文件,当以二进制格式存储文件,并且一行上一条 JSON 记录时,我们需要使用 seq() 函数来代替 lines() 函数。例如,当我们将 jsonline.txt 存储为二进制格式,则需使用如清单 10 所示的函数来读取:
清单 10. 读取二进制格式文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
jaql> read(seq("file:///xvdc/gaoyunhe/develop/jsonline.seq"))
-> transform catch( json($), {errThresh: 3} , $) -> filter not(isnull($));
[
{
"age": "23",
"name": "Tom",
"occupation": "student",
"sex": "man"
},
{
"age": "35",
"name": "Alice",
"occupation": "teacher",
"sex": "femal"
},
{
"age": "33",
"name": "Ben",
"occupation": "police",
"sex": "male"
}
]




整个文件符合 JSON 格式
返回列表