我有一个大约20GB的数据集,因此,如果不用完内存,我将无法将其读入R数据帧。在这里阅读了一些帖子之后,我决定将read.csv.sql用于数据库。我使用的代码是:



当我运行以下命令时:



我得到了列的标题,但是却没有值:
(或长度为0的行名)

但是,当我尝试使用虹膜数据集创建的csv进行相同操作时,一切正常。

我在这里想念什么?

提前致谢。

最佳答案

sqldf主要用于处理数据帧,因此它透明地创建数据库和数据库表,并在完成sql后将其删除。因此,您的第一条语句将无法正常工作,因为sqldf将在语句完成后删除数据库。

如果SQL创建数据库或表而不是sqldf本身,则sqldf不会知道它,因此不会删除它。在这里,我们使用attach创建数据库,并使用create table创建表以欺骗sqldf。在最后一行中,它不会删除数据库表,因为它们在该行开始之前就已经存在,并且从不会删除未创建的对象:

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")

可能出错的另一件事是行尾。通常,sqldf可以解决问题,但如果没有,则可能必须指定eol字符。例如,如果您试图读取在另一个操作系统中的一个操作系统上创建的文件,则可能需要指定该文件。请参阅常见问题解答11。为什么我很难使用SQLite in the sqldf README读取数据文件。

注意: read.csv.sql通常用于仅读取部分数据。例如,这会跳过前100行,然后从接下来的1000行中读取ab列,但是由于您可以使用所有SQLite的SQL,因此查询可能会非常复杂:
read.csv.sql("jobs.csv", sql = "select a, b from file limit 1000 offset 100")

整个文件被读入一个临时的sqlite数据库中,但是只有请求的部分才被读入R中,因此整个文件可能大于R可以处理的大小。

通常,如果要尝试实现持久性,则可以直接使用RSQLite而不是sqldf。

10-04 12:11
查看更多