【问题标题】:Trying to read 20GB of data, read.csv.sql Produces Errors尝试读取 20GB 的数据,read.csv.sql 产生错误
【发布时间】:2022-11-09 22:44:05
【问题描述】:

我有一个 csv 格式的 20GB 数据集,我正在尝试使用 read.csv.sql 命令对其进行修剪。

我可以使用以下命令成功加载前 10,000 个观察值:

testframe = read.csv(file.choose(),nrows = 10000)

列名如下图所示:

然后,我尝试使用以下命令构建精简的数据集,但出现错误:

reduced = read.csv.sql(file.choose(), 
                   sql = 'select * from file where "country" = "Poland" OR
                   country = "Germany" OR country = "France" OR country = "Spain"',
                   header = TRUE,
                   eol = "\n")

错误是:Error in connection_import_file(conn@ptr, name, value, sep, eol, skip) : RS_sqlite_import: C:\Users\feded\Desktop\AWS\biodiversity-data\occurence.csv line 262 expected 37 columns of data but found 38

为什么我可以轻松加载前 10,000 个观察结果,而第二个命令会出现问题?我希望您拥有能够在此问题上提供一些帮助所需的所有信息。

【问题讨论】:

  • 262行有什么奇怪的吗?您可以通过以下方式查询:readLines(file.choose(), n = 262)[262]
  • 如果您安装了 AWK,您可以使用 data.table::fread() 预处理数据以获取这些国家/地区的行,即 library(data.table); df <- fread("awk -F, '$22 ~ \"country\" || $22 ~ \"Poland\" || $22 ~ \"Germany\" || $22 ~ \"France\" || $22 ~ \"Spain\"' file.csv")(假设国家/地区是第 22 列,如您发布的图片中所示)
  • @jared_mamrot 我如何安装 AWK?我不知道它是什么,我搜索了包裹但没有找到。
  • AWK 是一种编程语言:gnu.org/software/gawk/manual/gawk.html。如果您使用的是 linux/macOS,它会预装在您的系统上。如果您使用的是 Windows,您可以按照以下说明安装它:gnu.org/software/gawk/manual/gawk.html#PC-Installation,但如果您还没有安装它,这可能不是一个好的解决方案。最简单的找出方法是尝试该命令并查看它是否有效
  • 已将我的 cmets 移至答案。

标签: r dataframe sqldf


【解决方案1】:

请注意,所有软件包的最新版本 read.csv.sql 再次工作。


RSQLite 在其与 SQLite 的接口中进行了重大更改,这意味着 read.csv.sql 和任何其他使用旧接口从 R 将文件读入 SQLite 的软件不再工作。 (sqldf 的其他方面仍然有效。)

查找str/grep

如果您这样做的唯一原因是将文件减少到指定的 4 个国家/地区,那么您可以在 Windows 上像这样预处理 csv 文件,假设 abc.csv 是您的 csv 文件并且它位于当前目录中。我们还假设 XYZ 是标题中的字符串。

DF <- read.csv(pipe('findstr "XYZ France Germany Poland Spain" abc.csv'))

在其他平台上使用 grep:

DF <- read.csv(pipe('grep "XYZ|France|Germany|Poland|Spain" abc.csv'))

如果这些词也可以出现在预期之外的字段中,则上述内容可能会检索一些额外的行,但如果这是一个问题,那么一旦你在 R 中有数据,就可以在 R 中使用 subsetfilter 来缩小它只是所需的行。

其他实用程序

还有许多命令行实用程序可以用作 findstr 和 grep 的替代品,例如 sed、awk/gawk(在 cmets 中提到)和专门针对 csv 文件的实用程序,例如 csvfix (C++)、miller (go)、 csvkit (python)、csvtk (go) 和 xsv (rust)。

xsv

以 xsv 为例,可以下载二进制文件here,然后假设 xsv 在当前目录或路径上,我们可以编写以下内容。这指示 xsv 提取指定正则表达式与国家列匹配的行。

cmd <- 'xsv search -s country "France|Germany|Poland|Spain" abc.csv'
DF <- read.csv(pipe(cmd))

SQLite 命令行工具

您可以使用 SQLite 命令行程序将文件读​​入它将为您创建的 SQLite 数据库。谷歌下载sqlite,为你的平台下载sqlite命令行工具并解压。然后从命令行(不是从 R)运行类似这样的东西来从 abc.csv 创建 abc.db SQLite 数据库。

sqlite3 --csv abc.db ".import abc.csv abc"

然后假设数据库在当前目录中,在 R 中运行:

library(sqldf)
sqldf("select count(*) from abc", dbname = "abc.db")

我不确定 sqlite 对于如此大的文件是否是一个不错的选择,但您可以尝试一下

H2

如果您有足够的内存来保存数据库(可能在命令行上使用 findstr/grep/xsv 或其他实用程序而不是 R 之后),另一种可能性是使用 H2 数据库后端从 R 到 sqldf。

如果 sqldf 发现包含 H2 驱动程序的 RH2 软件包已加载,它将使用该软件包而不是 SQLite。 (也可以使用 MySQL 或 PostgreSQL 后端,但这些后端涉及更多安装,因此我们不会介绍它们,尽管它们更有可能能够处理您拥有的大尺寸。)

请注意,RH2 驱动程序需要安装 rJava R 包,并且它需要 java 本身,尽管 java 很容易安装。 H2 数据库本身包含在 RH2 R 驱动程序包中,因此不必单独安装。同样,在会话中您第一次使用 rJava 访问 java 代码时,它必须加载 java 本身,这将需要一些时间,但此后在该会话中会更快。

library(RH2)
library(sqldf)

abc3 <- sqldf("select * from csvread('abc.csv') limit 3") |> 
  type.convert(as.is = TRUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2022-06-14
    相关资源
    最近更新 更多