Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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へのバインディング)

yutannihilation

December 11, 2019
Tweet

More Decks by yutannihilation

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide