在数据分析过程中,经常会处理文本文件中的结构化数据(txt,csv等),有时这些文件还会很大,计算机内存不足以一次性读入。这时,只能将数据分批读入内存,对每批数据计算出临时中间结果,分批处理完以后,再按照计算要求对分批处理结果进行恰当的汇总处理,与一次性装入内存的小文件数据计算有很大的不同。
实现大文件计算需要了解一个重要的概念—游标。我们以前比较熟知的是数据库游标,在数据库中使用游标,可以每次返回部分数据,而不将所有数据同时读入内存。游标类似于一个指针,在读取时会通过移动指针的位置来从结果集中每次提取部分记录。与数据库游标类似,在读取大文件数据时,也需要实现文件游标,它具有以下特点:
1、只用于获取数据,并不用来修改结果集。
2、在读取数据时从前向后只遍历一次。
有了游标对象,就可以把大文件计算步骤依次附加在游标对象上,在进行最后计算时,再逐条取出记录,按附加的步骤进行计算。
本文将以结构化文本文件为例,给出大文件过滤、聚合计算、添加计算列、排序、分组聚合、topN 以及并行计算等目标任务的实现方法,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,其采用的 SPL 中有完善的游标对象及运算,处理这些运算非常方便。
1. 过滤
过滤就是设置一个条件表达式,然后用每条记录的数据来计算表达式的值,如果计算结果值为真则本条记录有效,需要添加到最后取数的结果集里,否则就丢弃这条记录不用取出。对大文件过滤是一种延迟计算,就是先把过滤表达式记在游标对象上,等到取某条记录时,再计算过滤表达式来决定是否将本记录加入结果集。
示例:在大数据学生成绩文本文件students_scores.txt中,查找10班学生的成绩。列数据间用TAB分隔,部分数据如下图:
esProc SPL脚本如下:
A | 注释 | |
---|---|---|
1 | =file("E:/txt/students_scores.txt").cursor@t() | @t选项,把第一行读作标题 |
2 | =A1.select(CLASS==10) | 筛选出10班的学生成绩,延迟计算 |
3 | =file("E:/txt/students_scores_10.txt").export@t(A2) | 将过滤后的数据存入新的文件 |
2. 聚合计算
聚合计算是对大文件中的所有记录,执行某种统计计算,比如统计总和、平均值、最大值、最小值、计数等。循环遍历游标中所有记录,用每条记录数据计算出当前的聚合统计值,只把统计值存在内存中,而不用保存数据记录,就不会占据太多内存。遍历完毕后就得到最终的统计值。
示例:在大数据学生成绩文本文件students_scores.csv中,列数据间用逗号分隔,部分数据如下图:
计算语文成绩总分,esProc SPL脚本如下:
A |
---|