在数据分析计算中,将表中的记录排序,是很常见的需求。集算器中,可以用sort函数为序列或者序表中的数据排序。如果需要排序的数据量巨大,就不能一次将它们读入内存,这样普通的排序方法就无法执行了,此时需要使用外存排序。
如,文本文件Order_Foods.txt中,存储了50,000条食品的订单信息:
现在,需要将订单中的数据按照以下要求排序:
1、按照食品名称升序排序;
2、按照订单日期升序排序,日期相同的按照食品名称降序排序;
3、先按照订单日期降序排序,日期相同的按照订单金额降序排序。
在这里50,000条数据并不算很多,我们只是以此为例了解一下如何为大数据排序。在实际应用中,可能会遇到几亿条记录,或者几十上百G的数据文件。
在集算器中,遇到大数据时,需要使用游标来计算,数据表中的记录不会一次全部读出,而是按照设定每次读取一条或多条记录,这就可以避免数据计算时的内存溢出。但是,由于每次读取的都只是部分数据,如果需要对游标中的所有数据进行排序、分组等计算时,是无法直接完成的。集算器中的cs.sortx(x…;n)函数,可以利用外存,根据设定的缓冲区行数n来将游标内的数据逐步读出,分别处理并存储在外存文件中,以避免内存溢出。游标排序的结果仍然是一个游标,读取数据的方法和普通的游标完全相同。
下面我们看一下如何对Order_Foods.txt中的数据完成排序:
A2中,用文本文件Order_Foods.txt生成游标,用第一行作为列名。A3中使用sortx函数,将A2游标中的数据按照食品名称升序排序。排序时,设定了缓冲区行数是1000,这样每读出1000条记录就排序1次,将结果存为1个临时外存文件,排序完成的结果是一个游标:
在用这个游标取数时,将自动将生成的所有外存文件归并,读取出所需数据。如A4中读出了排序后的前1000条记录如下:
A5中将游标关闭后,刚刚排序时产生的外存文件都会自动清除。由于A3中的游标是由A2中游标生成的,因此A3中的游标关闭之后,A2中的游标也会关闭。如果需要计算按订单日期升序排序再按照食品名称降序排序的结果,需要在A6中重新生成游标。如果需要了解更多关于大数据排序的情况,请参阅http://blog.raqsoft.cn/?p=3063 。
A7中按需要将游标中的数据外存排序。sortx函数中,可以指定多个排序字段或排序表达式,如果某个表达式需要降序排序,需要在排序表达式前添加负号。A7中的排序结果同样是游标:
这一次,先在A8中跳过20,000条记录,再在A9中读出排序后的第20,001~21,000条数据如下:
游标使用完毕后,需要在A10中将其关闭,这样才能即时清理外存文件。如果游标中的数据全部读完,则会自动关闭,不必再调用cs.close()命令。
在排序表达式前加负号来执行降序排序的方法,不仅适用于A7中的字符类型数据,也适用于日期类型或者数值类型。在A12中执行降序排序时,分别使用了日期类型字段和数值类型字段,A13中读取了排序后数据的前1000条记录如下: