数据处理让你感到沮丧?好消息!DataStreams.jl 包,或者说框架,已经问世了!
DataStreams 处理框架为处理数据提供了一个一致的接口,从数据源到数据接收器,以及最终介于两者之间的每个步骤。它实际上是提出一个接口(特定类型和方法)来获取和传输数据源,希望为用户提供一致的体验,无论他们处理的是什么类型的数据。
DataStreams 的核心是创建“源”(表示真实数据源的 Julia 类型;例如 csv 文件、数据库后端等)、“接收器”或数据目标,以及定义适当的 Data.stream!(source, sink)
方法来实际将数据从源传输到接收器。让我们看一个简单的例子。
假设我在本地机器上有一个 CSV 文件中的数据表,并且需要在使用 GLM.jl 包构建模型之前对数据进行一些清理和聚合。让我们看看一些代码示例。
using CSV, SQLite, DataStreams, DataFrames
# let's create a Julia type that understands our data file
csv_source = CSV.Source("datafile.csv")
# let's also create an SQLite destination for our data
# according to its structure
db = SQLite.DB() # create an in-memory SQLite database
# creates an SQLite table
sqlite_sink = SQLite.Sink(Data.schema(csv_source), db, "mydata")
# parse the CSV data directly into our SQLite table
Data.stream!(csv_source, sqlite_sink)
# now I can do some data cleansing/aggregation
# ...various SQL statements on the "mydata" SQLite table...
# now I'm ready to get my data out and ready for model fitting
sqlite_source = SQLite.Source(sqlite_sink)
# stream our data into a Julia structure (Data.Table)
dt = Data.stream!(sqlite_source, Data.Table)
# convert to DataFrame (non-copying)
df = DataFrame(dt)
# do model-fitting
OLS = glm(Y~X,df,Normal(),IdentityLink())
在这里我们看到,通过包装真实数据源(我们的 CSV 文件)、该数据的目标(一个 SQLite 表)并传输数据,创建 Source
类型非常简单。然后,我们可以将我们的 SQLite.Sink
转换为 SQLite.Source
以再次获取数据。
实际上做了很多。即使 DataStreams 框架目前简单且简约,但它也经历了许多设计上的反复,包括今年在麻省理工学院举行的 JuliaCon 上的几次讨论。然而,即使有了简洁的小框架,大部分工作仍然在于在各个包中实际实现接口。今天可以发布的两个包是 CSV.jl 和 SQLite.jl。它们目前仅适用于 julia 0.4 及更高版本。
每个包的快速概述
CSV:提供用于处理 CSV 和其他分隔文件的文件类型和方法。旨在成为(并且目前是)Julia 中最快捷、最灵活的 CSV 阅读器。
SQLite:一个流行的 SQLite 本地机器数据库的接口。提供创建/管理数据库文件的方法,以及执行 SQL 语句和查看结果的方法。
ODBC.jl:下一个获得 DataStreams 改造的包是 ODBC。我已经开始着手这项工作,希望很快就能完成。
其他包:我一直在寻找传播该框架的新方法;如果您有兴趣为自己的包实现 DataStreams 或希望合作,只需 ping 我,我很乐意讨论!
转换:数据处理任务的重要组成部分不仅仅是连接到数据并将数据移动到其他地方:通常需要以某种方式清理/转换/聚合数据。目前,这取决于用户,但我有一些想法,围绕着创建对 DataStreams 友好的方法,以便在数据从一个地方流到另一个地方时轻松地合并转换步骤。
用于链接管道和转换的 DataStreams:我也对创建整个 DataStreams
的想法感到兴奋,它将定义端到端的数据处理任务。当我们开始研究自动并行性和可扩展性时,设置一个可以持续移动和处理数据的管道变得更加强大。
DataStream 调度/管理:我还对开发围绕 DataStreams 调度和管理的功能感兴趣。
DataStreams.jl 的工作是在 Julia Summer of Code 项目中进行的,这要感谢 戈登和贝蒂·摩尔基金会 和麻省理工学院的慷慨支持。