You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:08:17