我很长一段时间都避免在我的数据新闻工作中使用GNU make,部分原因是文档非常迟钝,我看不出make(许多提取-转换-加载(ETL)过程之一)如何帮助我的日常数据报告。但今年,为了构建金钱游戏,我每天需要加载1.4 GB的伊利诺伊州政治捐款和支出数据,而ETL过程需要几个小时,所以我给了Make另一个机会。
下面是它的工作原理,但是如果您想直接跳到代码,我们在这里将其开源。
如果文件X不存在,则将转换应用于文件Y并创建文件X。
这种“从文件Y开始获取文件X”模式是数据新闻的日常现实,使用make加载政治捐款和支出数据是一个很好的用例。数据相当大,通过速度较慢的FTP服务器访问,格式古怪,有足够的完整性问题来保持有趣,并且需要与遗留代码库兼容。要解决这个问题,我需要从头开始。
我们使用的财务披露数据来自伊利诺伊州选举委员会,但伊利诺伊州阳光项目已经发布了开源代码(不再可用)来处理ETL过程和筹款计算。使用他们的代码,ETL进程在健壮的硬件上运行大约两个小时,在我们的服务器上运行超过五个小时,有时会失败,原因我一直不太明白。我需要它工作得更好,速度更快。
使用Python清理数据以解决完整性问题并创建干净版本的数据文件。
使用高效但挑剔的“\copy”命令将干净的数据加载到PostgreSQL中。
转换数据库中的数据以清理列名,并使用“原始”和“公共”PostgreSQL模式和实例化视图(实质上是标准SQL视图的持久缓存版本)提供更直接有用的数据形式。
清理步骤必须在将任何数据加载到数据库之前进行,这样我们才能利用PostgreSQL的高效导入工具。如果单行在需要整数的列中有一个字符串,则整个操作将失败。
GNU make非常适合这项任务。Make的模型是围绕描述ETL过程应该生成的输出文件以及从一组原始源文件转换到一组输出文件所需的操作构建的。
与任何ETL流程一样,目标是保存原始数据,保持操作原子性,并提供可反复运行的简单且可重复的流程。
Data/Download/%.txt:aria2c-x5-q-d Data/Download--ftp-user=";$(ILCAMPAIGNCASH_FTP_USER)";--ftp-passwd=";$(ILCAMPAIGNCASH_FTP_PASSWD)";ftp://ftp.elections.il.gov/CampDisclDataFiles/$*.txtdata/processed/%.csv:Data/Download/%.txtpython Processor/Clean_isboe_tsv.py$<;$*>;[电子邮件受保护]。
这段代码首先通过FTP下载文件,然后使用Python处理它。例如,如果“expenditures.txt”是我的源数据文件之一,我可以运行make data/Proceded/Exexpitures.csv来下载和处理支出数据。
首先,我们使用Aria2来处理FTP任务。该脚本的早期版本使用了其他FTP客户端,这些客户端要么慢得像糖浆一样慢,要么使用起来很痛苦。经过反复试验,我发现Aria2比lftp(速度快但麻烦)或好的旧ftp(既慢又麻烦)做得更好。我还发现了一些咒语,下载时间从大约一个小时到不到20分钟。
其次,清理步骤对此数据集至关重要。它使用一个简单的基于类的Python验证方案,您可以在这里看到。需要注意的重要一点是,虽然Python通常相当慢,但Python3在这方面已经足够快了。而且,只要您只逐行处理,而没有在内存中积累任何对象或执行任何额外的磁盘写入,性能就会很好,即使是在ProPublica集群中的服务器这样的低资源机器上,也不会有任何意想不到的异常情况。