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

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

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

使用 JAQL 脚本读文件以下我们通过读取不同格式的文本文件为例,详细说明各个文件描述函数的用法。
CSV 文件通常,CSV 文件使用 del() 文件描述函数来读取。本文以文件 filecsv.csv 为例,描述如何正确读入 CSV 文件。filecsv.csv 文件内容如清单 1 所示:
清单 1. filecsv.csv 文件
1
2
3
4
> cat filecsv.csv
Tom,man,23,student
Alice,female,35,teacher
Ben, male,33,police




使用 del() 函数读取 filecsv.csv 的代码如清单 2 所示:
清单 2. 读取 filecsv.csv 文件命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
jaql> read(del(location='file:///xvdc/gaoyunhe/develop/filecsv.csv'));
[
[
"Tom",
"man",
"23",
"student"
],
[
"Alice",
"female",
"35",
"teacher"
],
[
"Ben",
"male",
"33",
"police"
]
]




而在实际应用中,我们很难保证输入的 CSV 文件中无空行、错行,而一旦输入的 CSV 文件不是完全正确的,使用 del() 函数就会出错。
仍以上述的 filecsv.csv 文件为例,我们添加几个错误的记录和空行,修改后 filecsv.csv 文件如清单 3 所示:
清单 3. 修改后的 filecsv.csv 文件
1
2
3
4
5
> cat filecsv.csv
Tom,man,23,student
Alice,female,35,teacher
Ben,male,33,polic
Bob,18,student




可以看到,第 3 行是空行,而第 5 行缺少了性别列。当我们仍然使用 del()函数来读取的时候,就会发生清单 4 所示错误。
清单 4. JAQL 错误示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
jaql> read(del(location='file:///xvdc/gaoyunhe/develop/filecsv.csv',
schema=schema{name: string, sex: string, age: long, occupation:string}));
encountered an exception during the evaluation of a statement
java.lang.reflect.UndeclaredThrowableException
originating expression ends at <stdin> (line: 2, column: 136)
java.lang.RuntimeException: Wrong number of fields on input at position 43
[
{
"name": "Tom",
"sex": "man",
"age": 23,
"occupation": "student"
},
{
"name": "Alice",
"sex": "female",
"age": 35,
"occupation": "teacher"
}




此时,为了增加容错性,我们需要使用 lines() 函数替代 del() 函数。首先需要加入错误检查,当某一行不满足 schema 格式的时候抛出错误,并继续执行,而不是终止程序。errorDel()module 用来处理在一个 CSV 文件中不满足指定格式的错误。因此,我们需要首先在 jaqlshell 中 import 该 module:
jaql> import errorDel;
然后,我们使用 lines() 函数来读取这个 CSV 文件,将 lines() 函数的输出传给 transform 操作,由 transform 操作调用 catch() 函数,将所有的 error 捕获,但不终止程序;然后将 transform 操作的输出传给 filter 操作,过滤掉所有不满足条件的记录(列数不为 4 的记录),最后再调用 transfrom 操作将 filter 的输出转化为 JSON 格式。代码如清单 5 所示。
清单 5. 包含容错的 csv 文件读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
jaql> read(lines('file:///xvdc/gaoyunhe/develop/filecsv.csv'))
-> transform catch (delToJson($), { errThresh: 3}, $ )
-> filter count($) == 4
-> transform {
    name: $[0],
    sex: $[1],
    age: $[2],
    occupation: $[3]
};
[
{
"name": "Tom",
"sex": "man",
"age": "23",
"occupation": "student"
},
{
"name": "Alice",
"sex": "female",
"age": "35",
"occupation": "teacher"
},
{
"name": "Ben",
"sex": "male",
"age": "33",
"occupation": "police"
}
]




至此,我们基本列出了所有 CSV 格式可能会遇到的问题,当原始文件中无错误行,使用 del() 来读取,当原始文件中可能存在错误行,则需使用 lines() 函数来读取。
返回列表