我有一个大约20GB的数据集,因此,我无法将其读入R数据帧而不会耗尽内存.在这里阅读了一些帖子后,我决定将read.csv.sql用于数据库.我使用的代码是:
read.csv.sql("jobs.csv",sql ="CREATE TABLE Jobs2 AS SELECT*FROM file",dbname ="Test1.sqlite")
当我运行以下内容时:
sqldf("select*from Jobs2",dbname ="Test1.sqlite")
我得到列的标题,但后来没有值:<0行>(或0长度row.names)
但是当我使用虹膜数据集创建的csv尝试相同时,一切正常.
我在这里错过了什么?
提前致谢.
sqldf主要用于处理数据帧,因此它可以透明地创建数据库和数据库表,并在完成sql后删除它们.因此,您的第一个语句不会起作用,因为sqldf会在语句完成后删除数据库.
如果SQL创建数据库或表而不是sqldf本身,则sqldf将不知道它,因此它不会删除它.这里我们使用attach和使用表来创建数据库create table来欺骗sqldf.在最后一行中,它不会删除数据库oir表,因为它们在该行启动之前已经存在,并且它永远不会删除它没有创建的对象:
library(sqldf)
read.csv.sql("jobs.csv", sql = c("attach 'test1.sqlite' as new",
"create table new.jobs2 as select * from file"))
sqldf("select * from jobs2", dbname = "test1.sqlite")
Run Code Online (Sandbox Code Playgroud)
可能出错的另一件事是线路结束.通常sqldf可以解决它,但如果没有,你可能需要指定eol字符.例如,如果您尝试读取在另一个操作系统中的一个操作系统上创建的文件,则可能需要指定它.请参阅常见问题解答11.为什么我 在sqldf README中使用SQLite读取数据文件时遇到困难.
注意: read.csv.sql通常用于读取部分数据.例如,这会跳过前100行,然后读取列a和b接下来的1000行,但查询可能是任意复杂的,因为您要使用所有SQLite的SQL:
read.csv.sql("jobs.csv", sql = "select a, b from file limit 1000 offset 100")
Run Code Online (Sandbox Code Playgroud)
整个文件被读入一个临时的sqlite数据库,但只有被请求的部分被读入R,所以整个文件可能比R可以处理的大.
通常,如果一个人试图实现持久性,则直接使用RSQLite而不是sqldf.
| 归档时间: |
|
| 查看次数: |
6072 次 |
| 最近记录: |