R中对两个Arrow表执行full_join时出现coalesce未实现错误
问题描述
尝试对同一数据源筛选处理后的两个Arrow表执行full_join()时,持续触发coalesce函数未实现的错误,但left/right/inner/semi/anti类型的连接均能正常运行。需求是连接时保留所有列(包含NA值)。
错误信息
Error: NotImplemented: Function 'coalesce' has no kernel matching input types (numeric(0) attr("class") [1] NA, numeric(0) attr("class")
核心代码
library(arrow) library(tidyverse) library(fastDummies) temp <- open_csv_dataset(sources = cohort_csvs) %>% compute() Subs <- data.frame(temp %>% distinct(key) %>% collect()) for (Subnum in 1:dim(Subs)[1]) { out <- data.frame(temp %>% filter(key == Subs[Subnum, ]) %>% collect()) out[is.na(out)] <- 'NA' out$tags <- 'NA' out <- dummy_cols( out, select_columns = "terms", remove_selected_columns = FALSE, omit_colname_prefix = TRUE ) out <- dummy_cols( out, select_columns = "tags", remove_selected_columns = FALSE, omit_colname_prefix = TRUE ) if (Subnum == 1){ Out_table <- arrow_table(out) } else { Out_table <- Out_table %>% full_join(out) } }
环境信息
- 操作系统:Red Hat Enterprise Linux Server 7.9 (Maipo)
- R版本:4.2.1
- RStudio版本:2022.07.0 Build 548
复现情况
以下示例代码可正常运行,未触发相同错误:
df <- arrow_table(data.frame (ID = c("ID1", "ID2", "ID3", "ID4", "ID5", "ID1", "ID2", "ID3", "ID4", "ID5", "ID1", "ID2", "ID3", "ID4", "ID5", "ID1", "ID2", "ID3", "ID4", "ID5", "ID1", "ID2", "ID3", "ID4", "ID5"), String = c("Value_A", "Value_B", "Value_C", "Value_D", "Value_E", "Value_F", "Value_G", "Value_H", "Value_I", "Value_J", "Value_A", "Value_C", "Value_C", "Value_C", "Value_E", "Value_G", "Value_G", "Value_H", "Value_I", "Value_J", "Value_K", "Value_L", "Value_M", "Value_N", "Value_N") )) UniqueIDs <- data.frame(df %>% distinct(ID) %>% collect()) for (IDcall in 1:dim(df %>% distinct(ID) %>% collect())[1]) { out <- data.frame(df %>% filter(ID == UniqueIDs[IDcall,]) %>% collect()) out <- dummy_cols( out, select_columns = "String", remove_selected_columns = FALSE, omit_colname_prefix = TRUE ) if (IDcall == 1){ Dummytable <- arrow_table(out) } else { Dummytable <- Dummytable %>% full_join(out) } }
问题原因与解决办法
原因分析
错误源于full_join合并Arrow表时,需要用coalesce处理NA值,但你的数据中存在长度为0的numeric类型列(numeric(0)),而Arrow的coalesce内核不支持这种空类型输入。
空numeric列的生成原因:
- 某轮循环中,
dummy_cols处理terms或tags列时,因列值全为统一内容(比如被替换为'NA'),无法生成有效哑变量,进而产生空列。 out[is.na(out)] <- 'NA'将所有NA替换为字符串'NA',导致dummy_cols无法识别有效类别,生成无效空列。
解决办法
1. 过滤空列
在两次dummy_cols操作后,过滤掉长度为0或全为空的列,避免空列进入连接环节:
# 添加在两次dummy_cols之后 out <- out[, sapply(out, function(col) length(col) > 0 && !all(is.na(col)))]
2. 修正NA值处理方式
不要将NA替换为字符串'NA',保留原生NA或用明确占位符,确保dummy_cols能生成有效哑变量:
# 保留原生NA out[is.na(out)] <- NA # 或用明确占位符 out[is.na(out)] <- "MISSING"
3. 统一列类型
每次生成out后,强制统一数值列类型,避免类型不兼容:
out <- as_tibble(out) # 将所有数值列转为double类型 numeric_cols <- sapply(out, is.numeric) out[numeric_cols] <- lapply(out[numeric_cols], as.double)
4. 调整连接策略
若上述方法无效,可先将累积的Arrow表转为本地数据框执行连接,再转回Arrow表(适合数据量不大的场景):
if (Subnum == 1){ Out_table <- arrow_table(out) } else { Out_table_local <- collect(Out_table) %>% full_join(out) Out_table <- arrow_table(Out_table_local) }
内容的提问来源于stack exchange,提问作者TDeramus
相关产品推荐
相关产品推荐

