Slide 1

Slide 1 text

RとApache Arrow 2019/12/11 Apache Arrow東京ミートアップ2019 @yutannihilation

Slide 2

Slide 2 text

ドーモ!! ● Hiroaki Yutani (@yutannihilation) ● 某メッセージングアプリ会社で データサイエンティスト見習い ● 好きな言語:R、忍殺語 ● ggplot2のメンテナ

Slide 3

Slide 3 text

Apache Arrowに、Rユーザーの こんな悩みを解決してほしい ● 他のシステム(Spark、DB)からデータ を取ってくるのが大変... – Java関連のセットアップが難しい – コピー・変換が遅い

Slide 4

Slide 4 text

Apache Arrowに、Rユーザーの こんな悩みを解決してほしい ● 他のデータ分析者(具体的にはPython) とデータを共有するのが大変... – CSVファイルで表現できないデータ型、 パース方法の差異 – メモリに乗りきらない巨大なデータ

Slide 5

Slide 5 text

● Sparkとの効率的なデータのやりとり (sparklyrパッケージ) ● ParquetやFeatherのデータを読み書き (arrowパッケージ) RとApache Arrow

Slide 6

Slide 6 text

R Spark sparklyr ①Sparkからデータを読み込み ②何らかの  処理 ③Sparkにデータを返す 例:Spark

Slide 7

Slide 7 text

R Spark sparklyr ①Sparkからデータを読み込み ②何らかの  処理 ③Sparkにデータを返す 例:Spark コピー と変換 ここが遅い

Slide 8

Slide 8 text

例:Spark ● 以前:一度データをディスクに書いてか らSparkとやりとりするので遅い ● 現在:Apache Arrowフォーマットで Sparkと直接やりとりできるようになった (SparkRは3.0からなのでまだ) ※コピーは発生する

Slide 9

Slide 9 text

例:Spark(sparklyr) (https://arrow.apache.org/blog/2019/01/25/r-spark-improvements/ の図) Spark → R R → Spark Apache Arrowあり

Slide 10

Slide 10 text

例: Parquet ● read_parquet()・write_parquet()で Parquetファイルを読み書きできる ● 指定した列だけを読むこともできる! (pushdown) → つまり、メモリに乗らず読めなかった データも読めるようになるかも

Slide 11

Slide 11 text

Parquet/Featherの読み書きは data.table::fread()より速い!! (https://ursalabs.org/blog/2019-10-columnar-perf/ の図) data.table arrow(feather)

Slide 12

Slide 12 text

Python派の人との データ共有にも便利 (https://ursalabs.org/blog/2019-10-columnar-perf/ の図) pyarrow 速い...

Slide 13

Slide 13 text

Parquetファイルの読み書き dplyr::select()と同じ指定で列を絞り込み arrow::read_parquet("tmp.parquet") arrow::read_parquet("tmp.parquet", starts_with("Sepal")) arrow::write_parquet(iris, "tmp.parquet")

Slide 14

Slide 14 text

開発の進展 ● CRANに登録されたのでインストールもお 手軽になった ● dplyrのバックエンドも開発中 ● Feather v2、Arrow Flight関連は進展なし

Slide 15

Slide 15 text

インストールがお手軽に ● これだけでOK install.packages("arrow")

Slide 16

Slide 16 text

dplyrのバックエンド ● dplyrの文法でデータ操作をすればArrow のデータ操作に翻訳してくれる ● select(列の絞り込み)→ 対応済み ● filter(行の絞り込み) → 対応済み ● mutate(値の操作)→ 未対応    ※Rのデータに変換してから処理

Slide 17

Slide 17 text

dplyrのバックエンド ● Gandivaでできる範囲はだいたい実装済み で、mutate()は計算カーネルを使うC++ APIができるの待ち、という感じ? ● Sparkのデータに関してはsparklyrがある ので、これ以上具体的なユースケースが思 いつかない...

Slide 18

Slide 18 text

Feather v2 ● 「feather」は、Arrowの仕様のすべてを サポートする「on-disk版のArrow format」を指す名前になる予定らしい (詳しくは ARROW-5510 を参照)

Slide 19

Slide 19 text

まとめ ● Spark ↔ Rのデータのやりとりが高速に ● Parquetファイルが読み書きできる ● CRANからインストールできる ● dplyrバックエンドも開発中