Posted at

SparkからGoogleスプレッドシートへアクセスしてみた

More than 3 years have passed since last update.

この記事はApache Spark Advent Calendar 2015の6日目の記事です。

この記事では、SparkからDataFrame APIを使ってGoogleスプレッドシートのデータを読み込む方法を解説します。


事前準備


1. OAuth認証に必要なcredential(p12)を取得



  • Goole Developers Consoleにアクセスする

  • プロジェクトを作る

  • プロジェクトを選択し、API Manager -> Crendentialsを選択

  • credentialの追加で、 Service Account Keyを作成し、サービスアカウントIDを確認する

  • p12ファイルをダウンロードする


2. スプレッドシートの共有設定

Sparkからアクセスしたいスプレッドシートを開き、共有設定にて1で作成したサービスアカウントを追加します。(gserviceaccount.comのメールアドレス)

以上で、Google API経由でスプレッドシートへアクセスする準備が整いました。


SparkからGoogleスプレッドシートへアクセスする

Googleスプレッドシートへのアクセスには、spark-google-spreadsheetsを使います。Scala APIとSQL APIがあるので、各APIの使い方を紹介します。


Scala API

まずは、以下のコマンドでspark-shellを起動します。

$SPARK_HOME/bin/spark-shell --packages com.github.potix2:spark-google-spreadsheets_2.10:0.1.1

--packagesオプションで起動時にmavenリポジトリからパッケージを取得して読み込むことができます。依存するライブラリも一緒に読み込んでくれるので便利です。

続いて、シェルからスプレッドシートのデータをData Frameとして読み込みます。

scala> val df = sqlContext.read.

| format("com.github.potix2.spark.google.spreadsheets").
| option("serviceAccontId", "xxxxxxxx@developer.gserviceaccount.com").
| option("credentialPath", "/path/to/google/api/credential.p12").
| option("spreadsheet", "YourSpreadsheetName").
| option("worksheet", "YourWorksheetName").
| load("YourSpreadsheetName")

あとは、いつも通りDataFrame APIが使えます。


SQL API

以下のコマンドで、SparkSQL CLIを起動します。

$SPARK_HOME/bin/spark-sql --packages com.github.potix2:spark-google-spreadsheets_2.10:0.1.1

CLIが起動したら、以下のSQLを実行します。

CREATE TEMPORARY TABLE YourSpreadsheetName

USING com.github.potix2.spark.google.spreadsheets
OPTIONS (
spreadsheet "YourSpreadsheetName",
worksheet "YourWorksheetName",
serviceAccountId "xxxxxxxx@developer.gserviceaccount.com",
/path/to/google/api/credential.p12)

あとは、いつも通りSQLが実行できます。


制限事項

spark-google-spreadsheetsは絶賛開発中のため現在、以下のような制約があります。


  • ヘッダ行が必須

  • 読み込みはA1から

  • すべて文字列として読み込まれる

  • 書き込みできない


まとめ

spark-google-spreadsheetsを使ってGoogleスプレッドシートのデータをSparkから読み込む方法を解説しました。

次回(20日)では、spark-google-spreadsheetsを例にカスタムDataSourceの実装方法について解説します。