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

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,而非保留对应表的键值

解决方法

  1. 升级 Arrow 包:该问题在 Arrow 11.0.0 及后续版本中已修复,升级后执行相同代码会得到与 tibble 一致的结果:
    install.packages("arrow")
    
  2. 临时兼容处理(无法升级时):通过指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:35:32