はじめに
Google Spread Sheetと連携して、データをDatabricksに取り込んでみたいと思います。
いくつか、過去のライブラリーなど利用しようとしてハマったので、同じ轍は踏まないように書いておきたいと思います。
開発中止ライブラリー
まず最初に目についたのが、Spark APIを使ったライブラリーspark-google-spreadsheetsだったのですが、Spark3の環境にインストールしようとするとエラーになってしまい、互換性もないということから利用しない方が良さそうです。
ということで、SparkAPIを使ったものは諦めて、通常のPythonライブラリーを使いたいと思います。
gspread / gspread-dataframe ライブラリー
検索してみると、gspreadというライブラリーがあるようです。また gspread-dataframeライブラリーを使うと、pandasデータフレームとして取り込む事ができるとの事なのでこちらが良さそうです。
手順1:Google 側の設定を行う
こちらの記事が非常にわかりやすかったので、こちらを参考に以下のGoogle側の設定を行います。
https://virment.com/enable-google-spreadsheet-api/
- Spreadsheet API を有効化する
- Service Accountの作成と Account Keyの発行
- Spreadsheet への permission設定
手順2:Account KeyファイルをDatabricksのDBFS上にアップロードする
上記のサービスアカウント作成時にダウンロードしたAccount Keyファイル(json)を DBFS上にアップロードします。
(注意)
DBFS上におくと他のユーザーもアクセスできてしまうのでその点だけご注意ください。もし他のユーザーとキーファイ
ルを共有したくない場合は、S3などにファイルを配置して、Instance Profileなどを利用して直接アクセスするようにしてください。
#手順3:Databricks Notebookから利用してみよう
これで準備は完了です。それではノートブックから利用してみましょう。
今回利用するGoogle Sheetはこちらです。
ファイル名はtest_data
シート名はtest_sheet
Google SheetのURLに大事なSheetID情報があります。
https://docs.google.com/spreadsheets/d/<ここの部分>/edit#gid=xxxx
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2206424%2F5af3c5c0-99cb-da54-b83d-af50b44b7071.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=21ef7561b5cacb030dd8631b06a403d6)
ライブラリーインストール
%pip install gspread
%pip install oauth2client
%pip install gspread-dataframe
Google認証情報とワークシート情報の設定&シートの読み込み
以下の3つの入力情報を入力の上実行すると、エラーがなければスプレッドシートをオブジェクトとして取得する事ができます。
import gspread
import json
from oauth2client.service_account import ServiceAccountCredentials
from gspread_dataframe import get_as_dataframe, set_with_dataframe
#2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
#######################################
####. 入力情報 (必要事項を入力ください)#######
########################################
credential_path = '<file path of .json>' # アップロードした認証ファイルのパスを指定します。 ex) /dbfs/FileStore/xxx.json
sheet_key = '<spread sheet key>' # 読み込むスプレッドシートのキーを入力します。 ex) '13aaiSIDJkhhynFU-0HyTVb5NUuXv-C31TsXLEftr3bA'
sheet_name = '<sheet name>' # ex) 'test_sheet'
#認証情報を設定し、OAuth2の資格情報を使用してGoogle APIにログインします。
credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scope)
gc = gspread.authorize(credentials)
#スプレッドシートを開く
workbook = gc.open_by_key(sheet_key)
#ワークシート名からワークシートを取得
worksheet = workbook.worksheet(sheet_name)
pandas DataFrameとして読み込み
get_as_dataframe関数で読み込めます。オプションを指定する事で読み込む対象や、ヘッダーなどを付与できます。
オプションはこちらのread_csvオプションが利用できるようです。
df_sps = get_as_dataframe(worksheet, usecols=[2,3,4,5], nrows=6, skiprows=0, header=3, index_col=0)
df_sps
その他
せっかくなので、もう少し触ってみます。
Spark DataFrameとして読み込み
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2206424%2F8b1b5552-ffa0-39b1-805b-32ce26f45229.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5a1acfecd04b7133eaeda0326f18171e)
Schemaを変更(Timestamp)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2206424%2Fbd096e2e-84b1-e6e1-6ba8-125dbc42d248.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=284ef8073cee960cc12c4490dabd254e)
DeltaLakeへの保存 & TempView作成
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2206424%2F9fe5c426-ddf1-8358-9ded-6b09764bd716.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=980e42fb4daf13251792bb8816aa398f)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2206424%2F9c94ebb1-7ce2-f276-a79e-832b11ed4af2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a148138477432f00ce87f9b48c5d90df)
参考サイト
サンプルノートブック
今回利用したサンプルノートブックはこちらから利用できます。