在R中转换丹麦CVR Elasticsearch API数据为数据框的问题
解决丹麦CVR Elasticsearch API的两个问题
问题1:获取超过10条数据
Elasticsearch的_search端点默认仅返回10条结果,针对不同数据量需求,有两种可行方案:
方案1:直接设置size参数(适合≤10000条数据)
修改GET请求,通过query参数指定返回条数,示例如下:
library(httr) # 示例:请求返回1000条数据 url <- GET("http://distribution.virk.dk/cvr-permanent/virksomhed/_search", authenticate("user_name", "password"), query = list(size = 1000))
注意:Elasticsearch默认限制size最大值为10000条,超过该数值需使用滚动查询。
方案2:滚动查询(Scroll API,适合大量数据)
若需获取上万条数据,用Scroll API分批拉取:
library(httr) # 初始请求:设置单次返回条数、scroll有效期(1分钟) initial_res <- GET("http://distribution.virk.dk/cvr-permanent/virksomhed/_search", authenticate("user_name", "password"), query = list(size = 1000, scroll = "1m")) # 解析初始响应,获取scroll_id和第一批数据 initial_content <- content(initial_res) scroll_id <- initial_content$`_scroll_id` all_data <- initial_content$hits$hits # 循环拉取剩余数据 while(length(initial_content$hits$hits) > 0) { scroll_res <- POST("http://distribution.virk.dk/_search/scroll", authenticate("user_name", "password"), body = list(scroll = "1m", scroll_id = scroll_id), encode = "json") initial_content <- content(scroll_res) if(length(initial_content$hits$hits) > 0) { all_data <- c(all_data, initial_content$hits$hits) scroll_id <- initial_content$`_scroll_id` } } # 清理scroll上下文,避免资源占用 DELETE(paste0("http://distribution.virk.dk/_search/scroll/", scroll_id), authenticate("user_name", "password"))
问题2:嵌套JSON转换为R数据框
你已定位到cont_raw$hits$hits下的_source$Vrvirksomhed是企业详情核心数据,只需提取这部分再转换即可,避免处理整个冗余嵌套结构:
方法1:用jsonlite自动展开嵌套
library(jsonlite) # 提取所有企业详情列表 vrvirksomhed_list <- lapply(all_data, function(x) x$`_source`$Vrvirksomhed) # 转换为数据框,flatten=TRUE自动展开嵌套字段 df <- fromJSON(toJSON(vrvirksomhed_list), flatten = TRUE)
方法2:用purrr简化提取与绑定
library(purrr) library(dplyr) # 提取并直接绑定为数据框,缺失字段自动填充NA df <- map_dfr(all_data, ~ .x$`_source`$Vrvirksomhed)
原方法失败原因
你之前尝试直接转换整个API返回结果,但Elasticsearch的响应包含took、timed_out等元数据,这些结构与企业详情的嵌套格式不一致,直接rbind必然导致列数不匹配。仅提取_source$Vrvirksomhed部分即可规避该问题。
内容的提问来源于stack exchange,提问作者Louise Sørensen
相关产品推荐
相关产品推荐

