📦

PHPer だって、 BigQuery を使いたい!

2022/06/15に公開

はじめに

いや、とうぜん使えるんですが、ほとんどの PHPキッズ たちは BigQuery が使えないと思います。日本において、 PHPキッズ たちが気軽に BigQuery をつかったら GDP は跳ねる訳です。 日本政府 や Google日本 はその点勉強が足りない訳です。電車に乗ってたらとなりのおじさんがそのように言ってました。さだかではありませんが、では私が一役買いましょう。

BigQuery どころじゃない

流行らない理由1は、Google Cloud Platform (GCP) が複雑でITバブルの黎明期みたいな状態であることが原因です。でも、これも要はどうするの?だけを最初に教えてくれたらいいんですよね。まず BigQuery にはjsonキーを発行するんですが、権限が付与されたキーでないとダメです。たとえばオーナーならなんでもできるだろ!っていうのは勘違いです。 BigQuery管理者のロールを与えてから、キーを発行してください。

できましたか?ここらへんはIAM権限がーとか、どのプロジェクトがーで、そのあとにサービスキーでjsonをDLします。

いよいよコーディング。サンプルよこせ!

ここがクリアできると、次はPHPサンプルよこせってなります。一応ありますが、Googleドキュメント内は少々蚊帳の外現象で、PHPサンプルをちょいちょい削ってきます。しぶしぶ英語圏のgithubリンクを踏んで、ソースを眺めることになります。

https://github.com/googleapis/google-cloud-php/tree/main/BigQuery

ライブラリを composer で落とします。 composer?どこでどうするの?って方は、今後のために composer の学習を先に優先させましょう、今後のために。

で、autoload読み込んでuseするっていう流れです。

require '/...../vendor/autoload.php';
use Google\Cloud\BigQuery\BigQueryClient;
putenv('GOOGLE_APPLICATION_CREDENTIALS=/..../.....json');

composerでDLすると、そのディレクトリに vendor とかできてその配下にライブラリが設置されているんで、そのライブラリ作成者のドキュメントにしたがってuseします。
GOOGLE_APPLICATION_CREDENTIALSは今回のライブラリではお約束の環境変数として github に英語で記述されています。

Authentication
Please see our Authentication guide for more information on authenticating your client. Once authenticated, you'll be ready to start making requests.

https://github.com/googleapis/google-cloud-php/blob/main/AUTHENTICATION.md

こういうの英語だと読み飛ばしちゃって、なんかうごかねーってなりますよね(・ω・;)

データセット作成

$this->bigQuery = new BigQueryClient([
	'projectId' => 'GCPのプロジェクトID'
]);

$this->dataset = $this->bigQuery->createDataset("DB名的");

データセットは create database です。プロジェクトIDはjsonファイル内にも記述があります。

テーブル作成

$this->bigQuery = new BigQueryClient([
	'projectId' => 'GCPのプロジェクトID'
]);

$dataset = $this->bigQuery->dataset("DB名");

$fields = [
	[
		'name' => 'field1',
		'type' => 'string',
		'mode' => 'required'
	],
	[
		'name' => 'field2',
		'type' => 'integer'
	],
];

$schema = ['fields' => $fields];
$this->table = $dataset->createTable("テーブル名", ['schema' => $schema]);

new BigQueryClientは共通なんで、上で一発newしとけばいいですが、一応明示的に書きました。あと、DB,TableはGCP管理画面上で事前にセットしておけばいい話ではあります。SQLワークスペースってページが、GCPの管理画面のどこかにあるんで探してみてください。そこでポチポチと作成できます。

テーブルにデータいれる

$this->bigQuery = new BigQueryClient([
	'projectId' => 'GCPのプロジェクトID'
]);

$query = "insert into PJT名.DB名.TBL名(field1, field2)values('aaa', 1)";
$jobConfig = $this->bigQuery->query($query);
$queryResults = $this->bigQuery->runQuery($jobConfig);

ここが真骨頂といいますか、 BigQuery を PHPer 達に流行らすトリガーです。そう、csvとかjsonとか、データ取り込む際にあまりなんだかなー的なところだったんですが、普通にSQLでいけます。なので、自社サービスのDBからセレクトしたものを bigQuery で insert 普通にできるんです。それの、 PHPライブラリ版サンプル をよこせって思うんですが、ググってもないんですね(笑)ないというかインデックスされてないのかな。それか順位が低い。需要がなくて。なんかPHPララベル版は見かけました。でもララベル使ってない人口の方がキッズ多いんで...

テーブルのデータを書き換える

$this->bigQuery = new BigQueryClient([
	'projectId' => 'GCPのプロジェクトID'
]);

$query = "update PJT名.DB名.TBL名 set field1 = 'abc' where field2 = 1";
$jobConfig = $this->bigQuery->query($query);
$queryResults = $this->bigQuery->runQuery($jobConfig);

こんな感じで、定番SQLは普通に動きます。処理時間は自前のDBサーバの方が速いですね。統計データとかを数十万レコード以上とかいれて、where句とかで検索する時とか、サーバ肥大化、バックアップ面も考えて BigQuery を候補に入れるんと思いますよ。

テーブル取得

$this->bigQuery = new BigQueryClient([
	'projectId' => 'GCPのプロジェクトID'
]);

$query = "select * from PJT名.DB名.TBL名";
$jobConfig = $this->bigQuery->query($query);
$queryResults = $this->bigQuery->runQuery($jobConfig);

$this->record = [];
$i = 0;
foreach ($queryResults as $row) {
	foreach ($row as $column => $value) {
		$this->record[$i][$column] = $value;
	}
	$i++;
}
#print("<pre>");var_dump($this->record);print("</pre>");

ちょいちょい $this があるのはクラス内でテストした切り抜きのためです。ペラPHPなら省いて問題ありません。

BigQuery PHP とかの似たような単語でググっても、select, insert, update がなかったり、PHP用じゃなかったりとかしたんで、動作テストして記事にしました。日本のキッズたちが BigQuery を気軽に楽しめる世界を夢見て――。

alter tableはない

削除はdelete fromという標準的なやつでいけます。いよいよ網羅してきましたが、カラム追加をSQLワークスペースでできても、削除はできません。これは作り直しをしないといけないためです。

CREATE OR REPLACE TABLE `pjt.dataset.table` AS 
SELECT * EXCEPT(消したいカラム1, 消したいカラム2) FROM `pjt.dataset.table`

上記でいけます。変更したいとなると、カラムを追加して、そっちにデータをコピーして、削除したいカラムを消すという手順が必要そうです。

参考

https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/bigquery/api/src

Google 標準 SQL のデータ操作言語(DML)ステートメント
https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax?hl=ja

Discussion