跳转到内容

Scanner 迭代 数据集 的片段,并根据给定的行过滤和列投影返回数据。ScannerBuilder 可以帮助创建一个 Scanner

工厂

Scanner$create() 包装了 ScannerBuilder 接口来创建一个 Scanner。它接受以下参数:

  • dataset:一个 Datasetarrow_dplyr_query 对象,由 Dataset 上的 dplyr 方法返回。

  • projection:一个用于选择列的列名字符向量,或一个命名的表达式列表。

  • filter:一个用于过滤扫描行的 Expression,或 TRUE(默认值)以保留所有行。

  • use_threads:逻辑值:扫描是否应该使用多线程?默认为 TRUE

  • ...:其他参数,目前忽略。

方法

ScannerBuilder 具有以下方法:

  • $Project(cols):指示扫描应该只返回 cols 给定的列,cols 是一个列名字符向量或一个命名的 表达式 列表。

  • $Filter(expr):通过 表达式 过滤行。

  • $UseThreads(threads):逻辑值:扫描是否应该使用多线程?该方法的默认输入为 TRUE,但您必须调用该方法才能启用多线程,因为扫描器的默认值为 FALSE

  • $BatchSize(batch_size):整数:扫描的记录批的最大行数,默认为 32K。如果扫描的记录批超过内存,则可以调用此方法来减小它们的大小。

  • $schema:活动绑定,返回数据集的 Schema

  • $Finish():返回一个 Scanner

Scanner 目前只有一个方法 $ToTable(),它会计算查询并返回一个 Arrow

示例

# Set up directory for examples
tf <- tempfile()
dir.create(tf)
on.exit(unlink(tf))

write_dataset(mtcars, tf, partitioning="cyl")

ds <- open_dataset(tf)

scan_builder <- ds$NewScan()
scan_builder$Filter(Expression$field_ref("hp") > 100)
#> ScannerBuilder
scan_builder$Project(list(hp_times_ten = 10 * Expression$field_ref("hp")))
#> ScannerBuilder

# Once configured, call $Finish()
scanner <- scan_builder$Finish()

# Can get results as a table
as.data.frame(scanner$ToTable())
#>    hp_times_ten
#> 1          1130
#> 2          1090
#> 3          1100
#> 4          1100
#> 5          1100
#> 6          1050
#> 7          1230
#> 8          1230
#> 9          1750
#> 10         1750
#> 11         2450
#> 12         1800
#> 13         1800
#> 14         1800
#> 15         2050
#> 16         2150
#> 17         2300
#> 18         1500
#> 19         1500
#> 20         2450
#> 21         1750
#> 22         2640
#> 23         3350

# Or as a RecordBatchReader
scanner$ToRecordBatchReader()
#> RecordBatchReader
#> 1 columns
#> hp_times_ten: double
#> 
#> See $metadata for additional Schema metadata