RでParquetの読み書き

R
作者

伊東宏樹

公開

2023年11月27日

そろそろRユーザーもApache ArrowでParquetを使ってみませんか?から4年。私もParquetを使ってみました。

データ

例として今回は、石狩川源流域の風倒後の森林更新データとして公開しているデータセットから植生被度データを利用します。

Itô, Hiroki (2018). Data on forest regeneration after catastrophic windthrow in the headwater region of the Ishikari River, Hokkaido, Japan. figshare. Dataset. doi:10.6084/m9.figshare.6442796.v3

まずデータをダウンロードします。

library(curl)
## Using libcurl 8.1.2 with LibreSSL/3.3.6

url <- "https://figshare.com/ndownloader/files/22237545"
tsv_file <- tempfile("cover.tsv")
curl(url) |>
  readLines() |>
  writeLines(file(tsv_file))

arrowパッケージでデータの読み書き

arrowパッケージを読み込みます。

library(arrow)
## 
##  次のパッケージを付け加えます: 'arrow'
##  以下のオブジェクトは 'package:utils' からマスクされています:
## 
##     timestamp

read_delim_arrow関数でタブ区切りデータを読み込み、最初の部分を表示します。

cover_data <- read_delim_arrow(tsv_file,
                               delim = "\t")
head(cover_data)
##   Belt Quadrat  Layer Year       Date                  Scientific_name
## 1   27       1 canopy 1980    1980-09 Betula platyphylla var. japonica
## 2   27       1 canopy 1984    1984-09 Betula platyphylla var. japonica
## 3   27       1 canopy 1988 1988-09-13 Betula platyphylla var. japonica
## 4   27       1 canopy 1988 1988-09-13                   Betula ermanii
## 5   27       1 canopy 1998 1998-07-23 Betula platyphylla var. japonica
## 6   27       1 canopy 1998 1998-07-23                   Betula ermanii
##   Japanese_name Cover
## 1    シラカンバ     5
## 2    シラカンバ     5
## 3    シラカンバ     5
## 4    ダケカンバ     1
## 5    シラカンバ     5
## 6    ダケカンバ     2

書き出し

Parquetではfactor型を扱えるということなので、Layer, Scientific_name, Japanese_name, Coverの4列をfactor型に変換してから、write_parquet関数を使用して、Parquetでデータを出力します。その後、念のため、書き出したオブジェクトを削除しておきます。

parquet_file <- tempfile("cover_data.parquet")

cover_data |>
  dplyr::mutate_at(c("Layer", "Scientific_name",
                     "Japanese_name", "Cover"), as.factor) |>
  write_parquet(parquet_file)

# remove object
rm("cover_data")

読み込み

今度は読み込みます。テキストファイルからの読み込みとはちがって、factor型がそのままfactor型となっています。

cover_data <- read_parquet(parquet_file)
head(cover_data)
## # A tibble: 6 × 8
##    Belt Quadrat Layer   Year Date       Scientific_name      Japanese_name Cover
##   <int>   <int> <fct>  <int> <chr>      <fct>                <fct>         <fct>
## 1    27       1 canopy  1980 1980-09    Betula platyphylla … シラカンバ    5    
## 2    27       1 canopy  1984 1984-09    Betula platyphylla … シラカンバ    5    
## 3    27       1 canopy  1988 1988-09-13 Betula platyphylla … シラカンバ    5    
## 4    27       1 canopy  1988 1988-09-13 Betula ermanii       ダケカンバ    1    
## 5    27       1 canopy  1998 1998-07-23 Betula platyphylla … シラカンバ    5    
## 6    27       1 canopy  1998 1998-07-23 Betula ermanii       ダケカンバ    2

read_parquetでは、列を指定した読み込みができるということで、一部の列のみを読み込んでみます。列の指定にはtidy-selectが使用できます。

cover_sub <- read_parquet(parquet_file, 
                          col_select = "Belt" | ends_with("name") | "Cover")
head(cover_sub)
## # A tibble: 6 × 4
##    Belt Scientific_name                  Japanese_name Cover
##   <int> <fct>                            <fct>         <fct>
## 1    27 Betula platyphylla var. japonica シラカンバ    5    
## 2    27 Betula platyphylla var. japonica シラカンバ    5    
## 3    27 Betula platyphylla var. japonica シラカンバ    5    
## 4    27 Betula ermanii                   ダケカンバ    1    
## 5    27 Betula platyphylla var. japonica シラカンバ    5    
## 6    27 Betula ermanii                   ダケカンバ    2

ということで、巨大なデータを読み込むときに威力を発揮しそうです。