RとTreasure Data
この記事は、Arm Treasure Data advent calendar 3日目です。
公式ドキュメントは、 Rについてはあまり書かれていないのですが、RからTreasureDataを使うにはRJDBC以外にもいくつかの方法があります。
基本的には、RPrestoとRTDをおさえておくのが良いでしょう。
- RPresto
- Facebookが開発しているPrestoのR client。TreasureDataでもアドホックなクエリを投げるときに便利
- RTD
- Rからdata frameをTreasure Dataにアップロードするのに使えるR client
- (12/18追記) レポジトリの場所がtreasure-dataの下になりました
- sparklytd
- RStudio社が開発するRのSpark clientであるsparklyrのplugin
- 内部で使うtd-sparkはSparkのサポートバージョンが上がるのが速いが、sparklyrのSparkの新バージョンサポートが遅いので少し低調なメンテナンス
実際の、RPrestoとRTDの使い方は以下のRmarkdownを見ていただくのが良いかと思います。 https://rpubs.com/chezou/TD-from-RPresto-RTD
RTDのインストール
インストールは、 devtools::install_github
を使うか、 install-github.me
を使うことでできます。
RTDは v0.2.0 からCRANに上げるのを辞めました。これはこれで一つの記事が書けるのですがそれはまた別の機会に譲ろうと思います。
余談ですが、CRANとの戦いの際にはr-wakalangの皆様に支えていただきました。Rに関する開発はもはやあそこなしには成り立ちません。Slackにぜひ参加するといいと思います。パッケージングから統計モデリングも話まで物凄い勢いで有識者が答えてくれます。
source("https://install-github.me/treasure-data/RTD@v0.2.0")
インストール後は、apikey
と endpoint
を適切なものを渡して上げることで、uploadができます。例えば nycflights13
パッケージの flights
データをアップロードしてみましょう。
library(RTD)
client <- Td(apikey = Sys.getenv("TD_API_KEY"), endpoint="api.treasuredata.com")
td_upload(client, "test", "flights", nycflights13::flights, overwrite=T)
v0.1.0 ではembulkが必須でしたが、今のバージョンは bulk import APIを使うようになっているため、特に追加でツールをインストールする必要はありません。
RPrestoでの接続
src_presto
する際には、 user
に TDのAPI keyを渡すこと、hostはこちらのendpointを参照してください。schemaはDatabase名、 catalogは td-presto
のままにしてください。
library(RPresto)
library(dplyr)
db <- src_presto(
host="https://api-presto.treasuredata.com",
port=443,
user=Sys.getenv("TD_API_KEY"),
schema='test',
catalog='td-presto'
)
flights_tbl <- tbl(db, 'flights')
flights_tbl
にテーブルが変数として割り当てられました。が、実際にはdplyrの諸々の処理を実行するときにSQLが走るのでalias程度に考えてください。
dplyrとggplot2で可視化する
それでは、 flights_tbl
をdplyrを使い集計して飛行機の平均遅延時間などを算出して、ggplot2で可視化してみましょう。
delay <- flights_tbl %>%
group_by(tailnum) %>%
summarise(count = n(), dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE)) %>%
filter(count > 20, dist < 2000) %>%
collect
# plot delays
library(ggplot2)
ggplot(delay, aes(dist, delay)) +
geom_point(aes(size = count), alpha = 1/2) +
geom_smooth() +
scale_size_area()
このような図ができたかと思います。
それでは、HappyなRとTreasureDataライフを!