在MySQL中设置大型数据库以便在R中进行分析。

10

我在使用 R 语言分析大型数据集时,已经达到了 RAM 的极限。我认为下一步应该是将这些数据导入 MySQL 数据库,并使用 RMySQL 包。但由于我不熟悉数据库行话,我不能够通过若干个小时的谷歌和 RSeeking(我正在 Mac OSX 10.6 上运行 MySQL 和 MySQL Workbench,但也可以运行 Ubuntu 10.04)来进行安装以外的操作。

是否有一个很好的指南可以帮助我开始这个用法?在此时此刻,我不想进行任何形式的关系数据库操作。我只想将 .csv 文件导入本地 MySQL 数据库,然后使用 RMySQL 进行子集筛选。

非常感谢任何提示(包括“您完全错了!”因为我是新手,特别是对于大数据集...这个数据集大约有80 mb)。


2
如果您是唯一访问数据库的人,sqlite可能是一个不错的选择(而且设置起来要少得多)...此外,80mb似乎不是一个非常大的数据集 - 您能否给我们提供一个您在其中耗尽RAM的示例? - Aaron Statham
3
同意,80 Mb 实际上微不足道。也许你的计算机或代码存在其他问题? - neilfws
@Aaron,@Neil -- 你们说得对。经过一晚上的休息,我回头看了一下,我的数据集并不大,只是比我以前做的要大一些。80 > 2,但GB >> MB,所以我需要再次检查代码(并增加我的耐心)。谢谢。 - Richard Herron
5个回答

6
RMySQL的文档非常好 - 但它假定您知道SQL的基础知识。这些是:
  • 创建数据库
  • 创建表格
  • 将数据放入表格中
  • 从表格中获取数据

第一步很容易:在MySQL控制台中,只需“create database DBNAME”。或者从命令行使用mysqladmin,或者通常有MySQL管理GUI。

第2步有点困难,因为您必须指定表字段及其类型。这将取决于CSV(或其他分隔符)文件的内容。一个简单的例子可能看起来像:

use DBNAME;
create table mydata(
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  height FLOAT(3,2)
); 

请创建一个包含两个字段的表格:id,它将是主键(因此必须是唯一的),并且在添加新记录时会自动递增;height,这里指定为浮点数(数字类型),总共有3位数字,小数点后有2位(例如100.27)。重要的是您了解data types

步骤3 - 有多种方法可以将数据导入表中。其中最简单的方法之一是使用mysqlimport实用程序。在上面的示例中,假设您的数据与表格名称相同(mydata),第一列是制表符,第二列是高度变量(没有标题行),则可以使用以下方法:

mysqlimport -u DBUSERNAME -pDBPASSWORD DBNAME mydata

第四步 - 需要您知道如何运行MySQL查询。再举一个简单的例子:

select * from mydata where height > 50;

意思是“从表mydata中获取所有行(id+height),其中height大于50”。

一旦你掌握了这些基础知识,就可以转向更复杂的例子,例如创建2个或更多的表,并运行查询以连接每个表中的数据。

然后 - 你可以去看RMySQL手册。在RMySQL中,你设置数据库连接,然后使用SQL查询语法将行返回为数据框。因此,真正重要的是你掌握SQL部分 - RMySQL部分很容易。

网上有很多MySQL和SQL教程,包括MySQL网站上的“官方”tutorial。只需谷歌搜索“mysql教程”即可。

就我个人而言,我认为80 Mb并不是一个大数据集;我很惊讶这会导致RAM问题,我相信本地R函数可以轻松处理它。但学习新技能,如SQL,即使你不需要它们解决这个问题也是好的。


@ Neil -- 感谢你的指引!步骤1-3一直困扰着我,主要是因为我一直专注于MySQL Workbench(我认为我不能从那里完成这些步骤)。 - Richard Herron

5
我有一个很好的建议,对于80MB的数据使用SQLite。SQLite是一个超级公共领域、轻量级、超级快速的基于文件的数据库,几乎像SQL数据库一样工作。 http://www.sqlite.org/index.html 您不必担心运行任何类型的服务器或权限,您的数据库句柄只是一个文件。
此外,它将所有数据都存储为字符串,因此您甚至不必担心将数据存储为类型(因为您需要做的就是模拟单个文本表)。
其他人提到了sqldf: http://code.google.com/p/sqldf/ 它确实与SQLite交互: http://code.google.com/p/sqldf/#9._How_do_I_examine_the_layout_that_SQLite_uses_for_a_table?_whi 因此,您的SQL创建语句将如下所示:
create table tablename (
  id INT(11) INTEGER PRIMARY KEY,
  first_column_name TEXT,
  second_column_name TEXT,
  third_column_name TEXT 
);

否则,neilfws的解释相当不错。
顺便说一下,我有点惊讶你的脚本在80mb上出现了问题。在R中,无法只是通过块查找文件而不将其全部加载到内存中吗?

2
sqldf包可能会为您提供更简单的方法来完成您需要的任务:http://code.google.com/p/sqldf/。尤其是如果您是唯一使用数据库的人。

编辑:以下是我认为在这种情况下它会有用的原因(来自网站):

使用sqldf,用户无需执行以下操作,所有这些操作都会自动完成:

  • 数据库设置
  • 编写定义每个表的创建表语句
  • 导入和导出数据库
  • 在常见情况下强制返回列以适当的类别

请参阅此处:在R中快速将非常大的表作为数据框读取


2
sqldf很好 - 如果你懂SQL的话。虽然,当你向R大师们提起sqldf时,他们会像看疯子一样看着你。有本地的R函数可以“join”和子集数据框架;sqldf是为那些比R更懂SQL的人准备的。 - neilfws
1
sqldf 还自动化了从大文件设置数据库的过程,并让您轻松地从中导入数据,这解决了 RAM 问题。 - Matti Pastell
JD Long的答案可能正是我需要的!今天我会尝试使用SQLdf和RMySQL!感谢你的帮助! - Richard Herron

1

我同意到目前为止所说的话。虽然我猜如果你要处理数据,从一般意义上开始使用MySQL(数据库)对于长期来说并不是一个坏主意。我的意思是,我查看了你的个人资料,上面写着金融博士生。我不知道这是否意味着量化金融,但你在职业生涯中很可能会遇到非常大的数据集。如果你能抽出一些时间,我建议学习一些关于数据库的知识。它只会有帮助。

MySQL本身的文档非常完整,你可以在SO上获得许多额外的(特定的)帮助。

我也在Mac OS X Snow Leopard上使用MySQL和MySQL Workbench。以下是帮助我相对容易地完成任务的方法。

  • 我安装了MAMP,它提供了一个带有PHP、MySQL和MySQL工具PHPmyadmin的本地Apache Web服务器,可以用作MySQL Workbench的良好基于Web的替代品(在Mac上不总是超级稳定:)。您将拥有一个小部件来启动和停止服务器,并可以通过浏览器访问一些基本配置设置(例如端口)。这里真的只需要一键安装。

  • 安装R包RMySQL。我会在这里放置我的连接字符串,也许这会有所帮助:

  • 使用MySQL Workbench创建您的数据库。在开始时,INT和VARCHAR(对于包含字符的分类变量)应该是您基本需要的字段类型。

  • 尝试找到最适合您的导入例程。我不知道您是否是一个shell/终端人员——如果是,您会喜欢neilfws建议的内容。您还可以使用LOAD DATA INFILE,这是我更喜欢的方法,因为它只需要一个查询,而不是逐行插入(INSERT INTO)

如果您能更准确地指定您遇到的问题,您将获得更具体的帮助 - 所以请随意提问 ;)

我假设您必须大量使用时间序列数据 - 有一个项目(TSMySQL)使用R和关系数据库(如MySQL,但也适用于其他DBMS)存储时间序列数据。此外,您甚至可以将R连接到FAME(在金融界很受欢迎,但价格昂贵)。最后一段内容肯定不是基础知识,但我认为它可能会帮助您考虑是否值得深入研究。


感谢提供Mac的指引!我认为Neil的1-3步骤会让我开始,但如果有任何Mac故障,我会回来的。而且,所有金融不都是量化的吗? ;) - Richard Herron
@richardh,关于财务部分我不太清楚,你是专家;)。 - Matt Bannert

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接