我有一个包含 31 个 gzip 压缩 TSV 的目录(2.8 GB 压缩/40 GB 未压缩)。我想根据 1 列的值有条件地导入所有匹配的行,并合并到一个数据框中。
我已经阅读了这里的几个答案,但似乎没有一个有效 - 我怀疑它们不适合处理那么多数据。
简而言之,我怎样才能:
- 读取 3 GB 的 gzip 压缩文件
- 仅导入列与特定值匹配的行
- 将匹配的行合并到一个数据框中。
数据很整洁,只有 4 列感兴趣:日期、ip、类型 (str)、类别 (str)。
我尝试使用的第一件事是read_tsv_chunked()
:
library(purrr)
library(IPtoCountry)
library(lubridate)
library(scales)
library(plotly)
library(tidyquant)
library(tidyverse)
library(R.utils)
library(data.table)
#Generate the path to all the files.
import_path <- "import/"
files <- import_path %>%
str_c(dir(import_path))
#Define a function to filter data as it comes in.
call_back <- function(x, pos){
unique(dplyr::filter(x, .data[["type"]] == "purchase"))
}
raw_data <- files %>%
map(~ read_tsv_chunked(., DataFrameCallback$new(call_back),
chunk_size = 5000)) %>%
reduce(rbind) %>%
as_tibble() # %>%
第一种方法适用于 9 GB 未压缩数据,但不适用于 40 GB。
第二种方法使用 fread()
(相同加载的包):
#Generate the path to all the files.
import_path <- "import/"
files <- import_path %>%
str_c(dir(import_path))
bind_rows(map(str_c("gunzip - c", files), fread))
看起来它开始工作,但随后被锁定。我不知道如何通过 select = c(colnames)
fread()
的参数里面map()
/str_c()
调用,更不用说一列的过滤条件了。
最佳答案
这更多的是一个策略答案。
R 将所有数据加载到内存中进行处理,因此您会遇到正在查看的数据量的问题。
我建议你做的,也是我所做的,是使用 Apache Spark 进行数据处理,并使用 R 包 Sparklyr 与其连接。然后,您可以将数据加载到 Spark 中,在那里进行处理,然后将汇总的数据集检索回 R 中以进行进一步的可视化和分析。
您可以在 R Studio 实例中本地安装 Spark 并在那里执行很多操作。如果您需要进一步的计算能力,请考虑托管选项,例如 AWS。
阅读本文 https://spark.rstudio.com/
一个技术点是,有一个 sparklyr
函数 spark_read_text
它将直接将分隔文本文件读取到 Spark 实例中。这非常有用。
从那里您可以使用dplyr
来操作您的数据。祝你好运!
关于r - 如何将 2.8 GB gzipped (40 GB TSV) 文件批量读取到 R 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959745/