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

Arrow Dataset列取模语法及Project后过滤的实现问题

关于Arrow Dataset取模运算与列复用的问题解答

1. Arrow Dataset中执行取模运算的正确语法

在R的Arrow包中,不能直接使用原生R的%%运算符实现Arrow表达式的取模逻辑,需要调用Arrow表达式API的Expression$mod()方法来完成。

针对beaver1数据集筛选整点数据的正确表达式写法为:

Expression$mod(Expression$field_ref("time"), 100L) == 0L

2. Project()定义的新列能否用于后续Filter()操作?

不能。Arrow的Scan操作逻辑中,Filter会在Project之前执行(即便API调用顺序写在Project之后,查询优化器也会调整执行顺序),Project阶段定义的新列在Filter阶段还未生成,无法被引用。

正确实现方式示例

方式一:直接在Filter中写入取模逻辑(无需额外生成新列)

## 写入测试数据集
arrow::write_csv_arrow(beaver1,"beaver1.csv")

DS <- arrow::open_dataset(sources = c("beaver1.csv"), format = "csv")

# 直接在Filter中使用mod表达式筛选整点数据
result <- DS$NewScan()$UseThreads()$Filter(
  Expression$mod(Expression$field_ref("time"), 100L) == 0L
)$Finish()$ToTable() |> 
  as.data.frame() |> 
  head()

print(result)
#   day time  temp activ
# 1 346  900 36.35     0
# 2 346 1000 36.81     0
# 3 346 1100 36.89     0
# 4 346 1200 36.78     0
# 5 346 1300 36.89     0
# 6 346 1400 36.77     0

方式二:使用Arrow兼容的dplyr语法(更简洁直观)

Arrow支持直接用dplyr函数操作Dataset,原生R的%%会被自动转换为Arrow支持的取模表达式:

library(dplyr)

result <- DS |>
  filter(time %% 100 == 0) |>
  collect() |>
  head()

print(result)

内容的提问来源于stack exchange,提问作者Matt Summersgill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:45:32