arrow 套件提供了將單個資料檔案讀取到記憶體中的函數,支援多種常見格式。預設情況下,呼叫這些函數中的任何一個都會返回一個 R 資料框。若要返回 Arrow Table,請設定參數 as_data_frame = FALSE
。
-
read_parquet()
:讀取 Parquet 格式的檔案 -
read_feather()
:讀取 Apache Arrow IPC 格式(先前稱為 Feather 格式)的檔案 -
read_delim_arrow()
:讀取分隔符號文字檔案(預設分隔符號為逗號) -
read_csv_arrow()
:讀取逗號分隔值 (CSV) 檔案 -
read_tsv_arrow()
:讀取 Tab 字元分隔值 (TSV) 檔案 -
read_json_arrow()
:讀取 JSON 資料檔案
對於將資料寫入單個檔案,arrow 套件提供了以下函數,這些函數可以與 R 資料框和 Arrow Table 一起使用
-
write_parquet()
:寫入 Parquet 格式的檔案 -
write_feather()
:寫入 Arrow IPC 格式的檔案 -
write_csv_arrow()
:寫入 CSV 格式的檔案
所有這些函數都可以讀取和寫入本機檔案系統或雲端儲存空間中的檔案。有關 arrow 中雲端儲存空間支援的更多資訊,請參閱雲端儲存空間文章。
arrow 套件也支援讀取大於記憶體的單個資料檔案,以及讀取和寫入多檔案資料集。這使得能夠分析和處理大於記憶體的資料,並提供將資料分割成更小區塊的能力,而無需將完整資料載入記憶體。有關此主題的更多資訊,請參閱資料集文章。
Parquet 格式
Apache Parquet 是儲存分析資料的熱門選擇;它是一種二進位格式,經過最佳化,可減少檔案大小並提高讀取效能,特別是對於基於欄的存取模式。使用 arrow 讀取和寫入 Parquet 資料最簡單的方法是使用 read_parquet()
和 write_parquet()
函數。為了說明這一點,我們將把 dplyr 中包含的 starwars
資料寫入 Parquet 檔案,然後再讀取回來。首先載入 arrow 和 dplyr 套件
接下來,我們將資料框寫入位於 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 樣式參數(delim
、quote
、escape_double
、escape_backslash
等)提供的選項外,您還可以使用 schema
參數來指定欄類型:有關詳細資訊,請參閱 schema()
說明。還可以選擇使用 parse_options
、convert_options
和 read_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
進一步閱讀
- 若要深入瞭解雲端儲存空間,請參閱雲端儲存空間文章。
- 若要深入瞭解多檔案資料集,請參閱資料集文章。
- Apache Arrow R cookbook 有關於將單個檔案讀取和寫入到記憶體中以及使用儲存在磁碟上的多檔案資料集的章節。