如何加速加载JSONL文件并展开含DataFrame的嵌套列?
大型JSONL文件加载与嵌套列展开提速方案
我有多个大小在100MB到1GB之间的大型压缩包,每个包内包含多个变量,其中部分变量为嵌套DataFrame。压缩包的下载与解压流程运行正常,但后续两项操作耗时极长:
- 在R中加载JSONL文件
- 展开包含DataFrame的嵌套列
单文件处理这两步耗时约1分钟,而我需要处理数百个这类文件。想请教提速方法,比如改用map()并行处理、换嵌套列展开方式、或者换JSONL加载方式?
警告:示例脚本会下载一个95MB的.zip文件,内含多个.jsonl文件,请按需使用。
if (!require("pacman")) install.packages("pacman") pacman::p_load( here, tidyverse, janitor, jsonlite ) #----- 下载与解压(无性能问题) -----# # URL url <- "https://data.jobtechdev.se/annonser/historiska/monthly/2006_monthly.zip" # 指定本地保存目录(可修改为你需要的路径) here() download_dir <- here("temp") filename <- "2006_monthly.zip" # 目录不存在则创建 if (!dir.exists(download_dir)) { dir.create(download_dir) } download.file(url, destfile = file.path(download_dir, filename), mode = "wb") unzip(here("temp", "2006_monthly.zip"), exdir = here("temp")) #----- 性能瓶颈区域 -----# # 以下两行耗时极长(标记为#1和#6) # 1 加载jsonl文件 jsonl_data_2006_01 <- stream_in(file(here("temp", "2006_01.jsonl"))) # 2 清理列名 jsonl_data_2006_01 <- jsonl_data_2006_01 |> clean_names() # 3 识别包含dataframe的列 dataframe_columns <- sapply(jsonl_data_2006_01, is.data.frame) # 4 获取包含dataframe的列名 dataframe_column_names <- names(dataframe_columns[dataframe_columns]) # 5 创建TRUE列名的字符向量 true_column_names <- names(dataframe_columns)[dataframe_columns] # 6 展开包含dataframe的嵌套列 jsonl_data_2006_01_unested <- jsonl_data_2006_01 |> unnest_wider(true_column_names, names_sep = "_")
编辑说明:
我已将代码重写为函数,并用here()替代相对路径,运行效果良好:
# 加载库 if (!require("pacman")) install.packages("pacman") pacman::p_load( here, # 相对路径工具 tidyverse, duckdb, jsonlite ) # 函数定义 import_jsonl_data <- function(select_cols) { test <- here::here("data", "dbdata", "2006_*.jsonl") duckdb_import_query <- paste0("SELECT ", select_cols, " FROM read_json_auto('", test, "');") # 启动内存中的DuckDB并加载JSON扩展 con <- dbConnect(duckdb()) dbExecute(con, "INSTALL json; LOAD json;") # 加载所有*.jsonl文件并返回扁平化结构的data.frame result <- dbGetQuery(con, duckdb_import_query) # 关闭连接 dbDisconnect(con, shutdown=TRUE) return(result) } # 测试调用 data_frame_2006 <- import_jsonl_data(select_cols)
内容的提问来源于stack exchange,提问作者Tomas R
相关产品推荐
相关产品推荐

