RとApache Arrow / r-and-apache-arrow

RとApache Arrow / r-and-apache-arrow

Apache Arrow東京ミートアップ2019の発表スライドです。

[参考リンク]
Apache Arrow
https://arrow.apache.org/

sparklyrの高速化について
https://arrow.apache.org/blog/2019/01/25/r-spark-improvements/

ParquetやFeatherの読み書きの速度比較について
https://ursalabs.org/blog/2019-10-columnar-perf/

dplyrバックエンドの実装はこのへん
https://github.com/apache/arrow/blob/master/r/R/dplyr.R (dplyrの各種メソッドの実装)
https://github.com/apache/arrow/blob/master/r/R/dataset.R (Dataset APIへのバインディング)

C95cdabc569dc4c7750d776687f66037?s=128

yutannihilation

December 11, 2019
Tweet

Transcript

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

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

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

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

    メモリに乗りきらない巨大なデータ
  5. • Sparkとの効率的なデータのやりとり (sparklyrパッケージ) • ParquetやFeatherのデータを読み書き (arrowパッケージ) RとApache Arrow

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

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

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

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

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

    データも読めるようになるかも
  11. Parquet/Featherの読み書きは data.table::fread()より速い!! (https://ursalabs.org/blog/2019-10-columnar-perf/ の図) data.table arrow(feather)

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

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

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

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

  16. dplyrのバックエンド • dplyrの文法でデータ操作をすればArrow のデータ操作に翻訳してくれる • select(列の絞り込み)→ 対応済み • filter(行の絞り込み) →

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

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

  19. まとめ • Spark ↔ Rのデータのやりとりが高速に • Parquetファイルが読み書きできる • CRANからインストールできる •

    dplyrバックエンドも開発中