始める無料で始める

高度な選択 II: SQL を使う

先ほど説明したように、dplyr インターフェースを使うと、sparklyr はコードを SQL に変換してから Spark に渡します。ほとんどの場合、これで問題ありません。ただし、同じ処理を生の SQL で直接記述することも可能です。コードが書きにくく、デバッグも難しくなるため、通常はあまり推奨されません。しかし、R 以外の環境でも使えるポータブルなコードが必要な場合には便利です。たとえば、sparklyr でデータ処理を試してから、本番環境では生の SQL に切り替えるというワークフローはよく見られます。最初から生の SQL で書いておけば、本番環境に移行する際にそのままクエリをコピー&ペーストできます。

SQL クエリは文字列として記述し、DBI パッケージの dbGetQuery() に渡します。基本的なパターンは次のとおりです。

query <- "SELECT col1, col2 FROM some_data WHERE some_condition"
a_data.frame <- dbGetQuery(spark_conn, query)

これまで書いてきた dplyr のコードとは異なり、dbGetQuery() はクエリをすぐに実行し、結果を R に返します。データの返却を遅らせたい場合は、dbSendQuery() でクエリを実行し、その後 dbFetch() で結果を取得することもできます。これは発展的な使い方のため、ここでは扱いません。また、DBI は低レベルなパッケージのため、DBI の関数は tibble ではなく data.frame を返す点にも注意してください。

SQL の書き方についてさらに学びたい方は、SQL 入門コースをご覧ください。

この演習はコースの一部です

sparklyr を使った Spark 入門(R)

コースを見る

演習の手順

Spark への接続は spark_conn として作成済みです。Spark に格納されたトラックのメタデータに紐づいた tibble は track_metadata_tbl として定義されており、SQL クエリでは track_metadata としてアクセスできます。

  • track_metadata Spark データフレームから、year が 1935 年未満かつ duration が 300 秒を超えるすべての列を選択するクエリを完成させましょう。
  • dbGetQuery() を呼び出してクエリを実行し、結果を results に代入してから出力を確認しましょう。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

# Write SQL query
query <- "SELECT ___ FROM ___ WHERE ___ AND ___"

# Run the query
(results <- ___(___, ___))
コードを編集して実行