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
相关产品推荐
相关产品推荐

