我正在处理大量(2,000多个)大zip文件(每个约300 MB)data from here。每个文件都具有相同的模式和结构。我希望迭代zip文件列表并执行以下操作:
- 解压缩文件
- 数据争用
- 将文件写入Parquet
我的方法是将mapply
通过管道传输到不同的数据处理函数(即clean_names
和group_by
),通过管道传输到write_dataset
(参见下面的代码)。然而,这种方法并不是我想要的方式。它是解压缩所有的文件,并将它们导入到一个单一的csv第一,然后执行数据争吵和写入数据。这在一些数据集上是可以的,但是当处理数千个数据集时,内存将很快成为一个问题,因为每个文件有大约700万行。
zip_files <- dput(list.files("~/data/raw", pattern = ".zip", full.names = TRUE))
file_names <- dput(
lapply(zip_files, unzip, list = TRUE) |>
dplyr::bind_rows() |>
dplyr::pull(Name)
)
mapply(unzip, zip_files, file_names) |>
readr::read_csv() |>
janitor::clean_names("all_caps") |>
dplyr::group_by(YEAR = lubridate::year(BASE_DATE_TIME),
MONTH = lubridate::month(BASE_DATE_TIME),
DAY = lubridate::day(BASE_DATE_TIME)) |>
arrow::write_dataset("~/data/parquet/ais_points",
format = "parquet",
max_rows_per_file = 1000000)
我想知道最好的方法是什么
- 从列表中解压缩文件
- 导入解压缩的csv
- 执行数据处理功能
- 写在 parquet 上
- 移动到列表中的下一个文件(又名冲洗和重复)
1条答案
按热度按时间5w9g7ksd1#
遍历zip文件列表,阅读和处理从
readr
转移到arrow
。这为可用的工具和库设置了一定的界限,但当前Map的函数列表相当令人印象深刻-https://arrow.apache.org/docs/r/reference/acero.html使用4个文件进行测试,得到的数据集有30495179行。
创建于2023-06-01使用reprex v2.0.2