数据分析从 Excel 到 SPL:遭遇大数据
Excel 是日常工作不可或缺的工具,处理数据快捷方便,深受欢迎。然而,它的数据处理能力并非无限制,当遇到大数据时,Excel 的能力就不行了。
拿几十万行的数据来说,光是在 Excel 里打开这么大的文件,都要几分钟,要是再进行复杂些的计算就会非常卡,甚至直接崩溃。当数据量超过 100 万行时,受容量的限制 Excel 会直接截断,无法处理。因此当面对大数据时 Excel 就不能再用了。
那么用数据库可以吗?数据库应付稍大的数据量是没问题的,但遗憾的是用起来太复杂,太难。首先是安装环境复杂,要配置很多东西,而且安装成功后,Excel 文件也必须要搬进数据库,变成数据库里的表才能使用。明明只想要处理一个文件,还要安装一个数据库,搬进搬出实在太麻烦。而且, SQL 解决问题的难度经常要远大于 Excel,代码逻辑往往要嵌套多层,写起来很烧脑,SQL 调试也困难,不好用。
那 BI 呢,看起来应该比较简单。BI 本身用起来倒是不难,但它解决大数据还是要依托数据库,同样还会面临环境准备的困难。BI 软件通常具有流畅的交互性和炫丽的界面,看上去很适合。不过,现在的 BI 工具在技术上已经被狭义化成多维分析,能做的运算非常少, 只有 SQL 的一个小子集,很多 Excel 熟手就会感觉很受限了。
看来,似乎只能借助于编程了,毕竟没有什么不能编程。
编程语言的计算能力确实更强,但是,对于习惯用 Excel 的分析师来说,大部分编程语言交互性差,门槛也高。例如 VBA 可以增强 Excel 的计算能力,但对结构化数据支持力度太差,编程任务过于繁琐。而且 VBA 没有内置的大数据能力,只能自己实现,更加繁琐。Python 的表格运算能力还行, 但它也没有直接的大数据支持,也要自己写。这些难度已经远远超出了 Excel 选手的能力范围。
那么 SPL 是什么,它就好用了吗?
没错,SPL 确实能处理大数据,而且用起来很简单,很适合做数据分析。
SPL 也是一门编程语言,擅长表格式数据的处理,计算能力强。其次它能处理大数据,几十万、上百万的数据跑起来很流畅,即使是内存装不下的超大数据也能计算。
重要的是,虽然 SPL 也是一门编程语言,但是它的使用方式和 Excel 很像,有很强的交互性,这对于 Excel 分析师们来说用起来很方便,不需要什么门槛。
举个例子,有一份 270 多万行的贷款订单数据,用 SPL 来处理它。
先来看一下 SPL 的界面,如下图。左边是代码公式区,右边是结果区。点击哪个格子就可以看到哪个格子的结果,交互性很好。
和 Excel 公式类似,SPL 的代码也是先写一个等号然后写公式内容。比如这里 A1 格的公式表示读入订单文件。执行公式后,在界面右边可以看到公式的计算结果,即订单数据内容。左边写公式,右边看结果,用起来很直观。
同样和 Excel 类似,SPL 的公式里也可以引用其他单元格。比如想要看下文件的数据量有多大,可以在 A2 写:=A1.len(),结果区可以看到这是一份 270 多万的数据。边写边看十分方便。
SPL 的函数语法简洁,容易理解。
A |
|
1 |
=file("listinginfo.csv").import@tc() |
2 |
=A1.len() |
3 |
=A1.select(auditing_date>date("2018-01-01") && principal>5000) |
4 |
=A3.groups(user_id,year(auditing_date):Year;sum(principal):Total) |
比如,A1 格 file().import() 是导入数据。
A2 格计算数据长度。
A3 格选出 2018 年以后订单金额 principal 大于 5000 的数据。
A4 格按照用户和年份分类汇总订单金额。
基本上看字面意思就能大概知道是干什么用的。代码直观易懂,学起来很容易。
对于一些内存里装不下的超大数据,SPL 也能处理,用游标技术。游标上函数的写法和内存是类似的,写起来也很容易。比如上面的例子用游标来写是这样的:
A |
|
1 |
=file("listinginfo.csv").cursor@tc() |
2 |
=A1.select(auditing_date>date("2018-01-01") && principal>5000) |
3 |
=A2.groups(user_id,year(auditing_date):Year;sum(principal):Total) |
A1 格子里的 cursor() 函数,表示将数据读成游标。其他语句的写法和内存里基本是一致的。
另外,SPL 还支持基于线程的并行计算,充分利用多核 CPU。比如,还是这个例子,只要在cursor()函数增加一个 @m 选项,性能直接起飞。
A |
|
1 |
=file("listinginfo.csv").cursor@tcm() |
2 |
=A1.select(auditing_date>date("2018-01-01") && principal>5000) |
3 |
=A2.groups(user_id,year(auditing_date):Year;sum(principal):Total) |