跳到內容

Scanner 會迭代 Dataset 的片段,並根據指定的列篩選和欄位投影返回資料。ScannerBuilder 可以協助建立一個。

工廠

Scanner$create() 包裝了 ScannerBuilder 介面以建立 Scanner。它接受以下參數

  • dataset:一個 Datasetarrow_dplyr_query 物件,由 Dataset 上的 dplyr 方法返回。

  • projection:一個字元向量,包含要選擇的欄位名稱,或一個具名的運算式列表

  • filter:一個 Expression,用於篩選掃描的列,或 TRUE (預設) 以保留所有列。

  • use_threads:邏輯值:掃描是否應使用多執行緒?預設值為 TRUE

  • ...:額外參數,目前忽略

方法

ScannerBuilder 具有以下方法

  • $Project(cols):指示掃描應僅返回由 cols 給定的欄位,cols 可以是欄位名稱的字元向量或 Expression 的具名列表。

  • $Filter(expr):依 Expression 篩選列。

  • $UseThreads(threads):邏輯值:掃描是否應使用多執行緒?此方法的預設輸入為 TRUE,但您必須呼叫此方法才能啟用多執行緒,因為掃描器預設值為 FALSE

  • $BatchSize(batch_size):整數:掃描的記錄批次的最大列數,預設值為 32K。如果掃描的記錄批次超出記憶體,則可以呼叫此方法來減少其大小。

  • $schema:主動綁定,返回 Dataset 的 Schema

  • $Finish():返回 Scanner

Scanner 目前只有一個方法,$ToTable(),它會評估查詢並返回 Arrow Table

範例

# 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