JSoC 2015 项目:DataStreams.jl

2015 年 10 月 25 日 | Jacob Quinn

数据处理让你感到沮丧?好消息!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.jlSQLite.jl。它们目前仅适用于 julia 0.4 及更高版本。

每个包的快速概述

接下来是什么?

DataStreams.jl 的工作是在 Julia Summer of Code 项目中进行的,这要感谢 戈登和贝蒂·摩尔基金会 和麻省理工学院的慷慨支持。