Arrow与dplyr中full_join执行结果不一致的问题求助
问题分析:Arrow Table 与 Tibble 的 full_join 结果差异
复现问题的代码
library(arrow) library(dplyr) # Arrow Table 测试 xa1 <- arrow_table(x = 1L) xa2 <- arrow_table(x = 2L) arrow_result <- full_join(xa1, xa2, on = "x") %>% collect() print(arrow_result) #> # A tibble: 2 × 1 #> x #> <int> #> 1 1 #> 2 NA # Tibble 测试 x1 <- tibble(x = 1L) x2 <- tibble(x = 2L) tibble_result <- full_join(x1, x2) print(tibble_result) #> Joining, by = "x" #> # A tibble: 2 × 1 #> x #> <int> #> 1 1 #> 2 2
差异原因
这是Arrow 早期版本(<11.0.0)的 dplyr 接口中,full_join 对连接键的处理逻辑与 dplyr 原生实现不一致导致的:
- dplyr 原生的
full_join会保留左右表未匹配行的连接键原值:左表无匹配的行保留左表的x,右表无匹配的行保留右表的x - 旧版 Arrow 的
full_join在生成未匹配行时,会将连接键列统一设置为NA,而非保留对应表的键值
解决方法
- 升级 Arrow 包:该问题在 Arrow 11.0.0 及后续版本中已修复,升级后执行相同代码会得到与 tibble 一致的结果:
install.packages("arrow") - 临时兼容处理(无法升级时):通过指定
suffix区分左右表的连接键,再用coalesce合并非NA值:full_join(xa1, xa2, on = "x", suffix = c(".x", ".y")) %>% mutate(x = coalesce(x.x, x.y)) %>% select(x) %>% collect() #> # A tibble: 2 × 1 #> x #> <int> #> 1 1 #> 2 2
内容的提问来源于stack exchange,提问作者Vitalijs
相关产品推荐
相关产品推荐

