跳到內容

arrow 套件提供了將單個資料檔案讀取到記憶體中的函數,支援多種常見格式。預設情況下,呼叫這些函數中的任何一個都會返回一個 R 資料框。若要返回 Arrow Table,請設定參數 as_data_frame = FALSE

對於將資料寫入單個檔案,arrow 套件提供了以下函數,這些函數可以與 R 資料框和 Arrow Table 一起使用

所有這些函數都可以讀取和寫入本機檔案系統或雲端儲存空間中的檔案。有關 arrow 中雲端儲存空間支援的更多資訊,請參閱雲端儲存空間文章

arrow 套件也支援讀取大於記憶體的單個資料檔案,以及讀取和寫入多檔案資料集。這使得能夠分析和處理大於記憶體的資料,並提供將資料分割成更小區塊的能力,而無需將完整資料載入記憶體。有關此主題的更多資訊,請參閱資料集文章

Parquet 格式

Apache Parquet 是儲存分析資料的熱門選擇;它是一種二進位格式,經過最佳化,可減少檔案大小並提高讀取效能,特別是對於基於欄的存取模式。使用 arrow 讀取和寫入 Parquet 資料最簡單的方法是使用 read_parquet()write_parquet() 函數。為了說明這一點,我們將把 dplyr 中包含的 starwars 資料寫入 Parquet 檔案,然後再讀取回來。首先載入 arrow 和 dplyr 套件

library(arrow, warn.conflicts = FALSE)
library(dplyr, warn.conflicts = FALSE)

接下來,我們將資料框寫入位於 file_path 的 Parquet 檔案

file_path <- tempfile()
write_parquet(starwars, file_path)

Parquet 檔案的大小通常比對應的 CSV 檔案小得多。這部分歸因於檔案壓縮的使用:預設情況下,使用 arrow 套件寫入的 Parquet 檔案使用 Snappy 壓縮,但也支援 gzip 等其他選項。有關更多資訊,請參閱 help("write_parquet", package = "arrow")

寫入 Parquet 檔案後,我們現在可以使用 read_parquet() 讀取它

read_parquet(file_path)
## # A tibble: 87 x 14
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke Sk~    172    77 blond      fair       blue            19   male  mascu~
##  2 C-3PO       167    75 NA         gold       yellow         112   none  mascu~
##  3 R2-D2        96    32 NA         white, bl~ red             33   none  mascu~
##  4 Darth V~    202   136 none       white      yellow          41.9 male  mascu~
##  5 Leia Or~    150    49 brown      light      brown           19   fema~ femin~
##  6 Owen La~    178   120 brown, gr~ light      blue            52   male  mascu~
##  7 Beru Wh~    165    75 brown      light      blue            47   fema~ femin~
##  8 R5-D4        97    32 NA         white, red red             NA   none  mascu~
##  9 Biggs D~    183    84 black      light      brown           24   male  mascu~
## 10 Obi-Wan~    182    77 auburn, w~ fair       blue-gray       57   male  mascu~
## # i 77 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list<character>>,
## #   vehicles <list<character>>, starships <list<character>>

預設是返回資料框或 tibble。如果我們想要 Arrow Table,我們應該設定 as_data_frame = FALSE

read_parquet(file_path, as_data_frame = FALSE)
## Table
## 87 rows x 14 columns
## $name <string>
## $height <int32>
## $mass <double>
## $hair_color <string>
## $skin_color <string>
## $eye_color <string>
## $birth_year <double>
## $sex <string>
## $gender <string>
## $homeworld <string>
## $species <string>
## $films: list<element <string>>
## $vehicles: list<element <string>>
## $starships: list<element <string>>

Parquet 檔案的一個有用功能是它們以欄方式儲存資料,並包含允許檔案讀取器跳到檔案相關區段的中繼資料。這表示可以僅載入欄的子集,而無需讀取完整檔案。read_parquet()col_select 參數支援此功能

read_parquet(file_path, col_select = c("name", "height", "mass"))
## # A tibble: 87 x 3
##    name               height  mass
##    <chr>               <int> <dbl>
##  1 Luke Skywalker        172    77
##  2 C-3PO                 167    75
##  3 R2-D2                  96    32
##  4 Darth Vader           202   136
##  5 Leia Organa           150    49
##  6 Owen Lars             178   120
##  7 Beru Whitesun Lars    165    75
##  8 R5-D4                  97    32
##  9 Biggs Darklighter     183    84
## 10 Obi-Wan Kenobi        182    77
## # i 77 more rows

可以使用 props 參數對 Parquet 讀取器進行細緻的控制。有關詳細資訊,請參閱 help("ParquetArrowReaderProperties", package = "arrow")

當將資料寫入 Parquet 或 Arrow/Feather 檔案,以及將這些檔案讀回 R 時,R 物件屬性會被保留。這使得能夠往返寫入和讀取 sf::sf 物件、具有 haven::labelled 欄的 R 資料框,以及具有其他自訂屬性的資料框。若要深入瞭解如何在 arrow 中處理中繼資料,請參閱中繼資料文章

Arrow/Feather 格式

Arrow 檔案格式的開發旨在為資料框提供二進位欄式序列化,以提高讀取和寫入資料框的效率,並使跨資料分析語言共享資料變得容易。此檔案格式有時稱為 Feather,因為它是原始 Feather 專案的延伸,該專案現已移至 Arrow 專案本身。您可以在 Arrow 規格頁面上找到 Arrow 格式版本 2 的詳細規格 – 官方稱為 Arrow IPC 檔案格式

write_feather() 函數預設寫入版本 2 Arrow/Feather 檔案,並支援多種類型的檔案壓縮。基本用法如下所示

file_path <- tempfile()
write_feather(starwars, file_path)

read_feather() 函數提供了一個熟悉的介面,用於讀取 feather 檔案

read_feather(file_path)
## # A tibble: 87 x 14
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke Sk~    172    77 blond      fair       blue            19   male  mascu~
##  2 C-3PO       167    75 NA         gold       yellow         112   none  mascu~
##  3 R2-D2        96    32 NA         white, bl~ red             33   none  mascu~
##  4 Darth V~    202   136 none       white      yellow          41.9 male  mascu~
##  5 Leia Or~    150    49 brown      light      brown           19   fema~ femin~
##  6 Owen La~    178   120 brown, gr~ light      blue            52   male  mascu~
##  7 Beru Wh~    165    75 brown      light      blue            47   fema~ femin~
##  8 R5-D4        97    32 NA         white, red red             NA   none  mascu~
##  9 Biggs D~    183    84 black      light      brown           24   male  mascu~
## 10 Obi-Wan~    182    77 auburn, w~ fair       blue-gray       57   male  mascu~
## # i 77 more rows
## # i 5 more variables: homeworld <chr>, species <chr>, films <list<character>>,
## #   vehicles <list<character>>, starships <list<character>>

與 Parquet 讀取器類似,此讀取器支援僅讀取欄的子集,並且可以產生 Arrow Table 輸出

read_feather(
  file = file_path,
  col_select = c("name", "height", "mass"),
  as_data_frame = FALSE
)
## Table
## 87 rows x 3 columns
## $name <string>
## $height <int32>
## $mass <double>

CSV 格式

arrow 套件的讀/寫功能也包括支援 CSV 和其他文字分隔檔案。read_csv_arrow()read_tsv_arrow()read_delim_arrow() 函數都使用 Arrow C++ CSV 讀取器來讀取資料檔案,其中 Arrow C++ 選項已對應到參數中,其方式與 readr::read_delim() 中使用的慣例相似,並具有受 vroom::vroom() 啟發的 col_select 參數。

以下顯示使用 arrow 寫入和讀取 CSV 檔案的簡單範例

file_path <- tempfile()
write_csv_arrow(mtcars, file_path)
read_csv_arrow(file_path, col_select = starts_with("d"))
## # A tibble: 32 x 2
##     disp  drat
##    <dbl> <dbl>
##  1  160   3.9 
##  2  160   3.9 
##  3  108   3.85
##  4  258   3.08
##  5  360   3.15
##  6  225   2.76
##  7  360   3.21
##  8  147.  3.69
##  9  141.  3.92
## 10  168.  3.92
## # i 22 more rows

除了 readr 樣式參數(delimquoteescape_doubleescape_backslash 等)提供的選項外,您還可以使用 schema 參數來指定欄類型:有關詳細資訊,請參閱 schema() 說明。還可以選擇使用 parse_optionsconvert_optionsread_options 來對 arrow csv 讀取器進行細緻的控制:有關詳細資訊,請參閱 help("CsvReadOptions", package = "arrow")

JSON 格式

arrow 套件支援從行分隔 JSON 中讀取(但不寫入)表格資料,使用 read_json_arrow() 函數。以下顯示一個最小範例

file_path <- tempfile()
writeLines('
    { "hello": 3.5, "world": false, "yo": "thing" }
    { "hello": 3.25, "world": null }
    { "hello": 0.0, "world": true, "yo": null }
  ', file_path, useBytes = TRUE)
read_json_arrow(file_path)
## # A tibble: 3 x 3
##   hello world yo   
##   <dbl> <lgl> <chr>
## 1  3.5  FALSE thing
## 2  3.25 NA    NA   
## 3  0    TRUE  NA

進一步閱讀