R 中箭头数据集过滤表达式的正确语法

Proper Syntax for Filtering Expressions for Arrow Datasets in R

我正在尝试使用 arrow(相对最近实现的) DataSet API 将文件目录读入内存,并利用c++ 后端过滤行和列。我想直接使用 arrow 包函数,而不是 dplyr 风格动词的包装函数。截至今天,这些函数还处于其生命周期的早期阶段,因此我很难找到一些说明语法的示例。

为了理解语法,我创建了一个非常小的测试示例。前两个查询按预期工作。

library(arrow) ## version 4.0.0

write.csv(mtcars,"ArrowTest_mtcars/mtcars.csv")
## Define a dataset object
DS <- arrow::open_dataset(sources = "ArrowTest_mtcars", format = "text")

## Generate a basic scanner 
AT <- DS$NewScan()$UseThreads()$Finish()$ToTable()
head(as.data.frame(AT), n = 3)
##                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
## 1         Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 2     Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 3        Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

## Generate a basic scanner with projection to select columns
AT <- DS$NewScan()$UseThreads()$Project(c("mpg","cyl"))$Finish()$ToTable()
head(as.data.frame(AT), n = 3)    
#   mpg cyl
#1 21.0   6
#2 21.0   6
#3 22.8   4

但是,我还没有弄清楚实现过滤表达式的正确语法。我已经尝试了很多事情,但我最好的猜测仍然没有用,并且在我执行 Filt <- Expression$create(...) 行时导致段错误。

## Generate a basic scanner with filtering where column `cyl` = 6    
## My best guess at what might work, but causes a segfault instead
Filt <- Expression$create("==",args = list(Expression$field_ref("cyl"), Scalar$create(6L)))

AT <- DS$NewScan()$UseThreads()$Filter(Filt)$Finish()$ToTable()
head(as.data.frame(AT))

实现基于行的过滤的正确语法是什么?

关于这方面的文档非常糟糕。但是一些尝试和测试实际上让我得到了一些可能会引导你找到正确答案的东西。我发现的问题是 Scalar$create and 知道要使用哪个函数:

Filt = Expression$create('or', 
                         args = list(Expression$field_ref("cyl") == 6L, 
                                     Expression$field_ref('cyl') == 4L))

AT <- DS$NewScan()$UseThreads()$Filter(Filt)$Finish()$ToTable()
head(as.data.frame(AT))

但是,请注意,对于单个条件,仅使用 Expression$field_ref(...) == x 直接在过滤器中工作

AT <- DS$NewScan()$UseThreads()$Filter(Expression$field_ref("cyl") == 6L)$Finish()$ToTable()
head(as.data.frame(AT))