このラボでは、BigQuery でクエリを実行し、パーティション分割テーブルを作成して、クエリのパフォーマンスを向上させ、リソース使用量を削減する方法を学習します。このラボで使用するデータは、Google Merchandise Store に関する数百万件の Google アナリティクス レコードが格納された e コマース データセットで、BigQuery に読み込まれています。
#standardSQL
CREATE OR REPLACE TABLE ecommerce.partition_by_day
PARTITION BY date_formatted
OPTIONS(
description="a table partitioned by date"
) AS
SELECT DISTINCT
PARSE_DATE("%Y%m%d", date) AS date_formatted,
fullvisitorId
FROM `data-to-insights.ecommerce.all_sessions_raw`
このクエリには、PARTITION BY <フィールド> という新しいオプションがあります。
パーティション分割に使用できるオプションは DATE と TIMESTAMP の 2 つです。
ここでは、文字列として保存されている日付フィールドをパーティショニングに適した DATE 型に変換するために、PARSE_DATE 関数を使用しています。
#standardSQL
SELECT
DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date,
(SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations
WHERE stations.usaf = stn) AS station_name, -- Stations may have multiple names
prcp
FROM `bigquery-public-data.noaa_gsod.gsod*` AS weather
WHERE prcp < 99.9 -- Filter unknown values
AND prcp > 0 -- Filter stations/days with no precipitation
AND _TABLE_SUFFIX >= '2018'
ORDER BY date DESC -- Where has it rained/snowed recently
LIMIT 10
注: TABLE_SUFFIX フィルタで参照されるテーブルの数を制限するために、FROM 句でテーブル ワイルドカード * が使用されています。注: LIMIT 10 が追加されていますが、まだパーティションがないため、スキャンされるデータの総量(約 1.83 GB)は減りません。
[実行] をクリックします。
日付の形式が正しいこと、降水量フィールドの値が 0 でないことを確認します。
タスク 5. 実習: パーティション分割テーブルを作成する
前のクエリを変更してテーブルを作成します。次のように指定します。
テーブル名: ecommerce.days_with_rain
PARTITION BY に date フィールドを使用
OPTIONS に partition_expiration_days = 60 を指定
description = "weather stations with precipitation, partitioned by day" を追加
クエリは次のようになります。
#standardSQL
CREATE OR REPLACE TABLE ecommerce.days_with_rain
PARTITION BY date
OPTIONS (
partition_expiration_days=60,
description="weather stations with precipitation, partitioned by day"
) AS
SELECT
DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date,
(SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations
WHERE stations.usaf = stn) AS station_name, -- Stations may have multiple names
prcp
FROM `bigquery-public-data.noaa_gsod.gsod*` AS weather
WHERE prcp < 99.9 -- Filter unknown values
AND prcp > 0 -- Filter
AND _TABLE_SUFFIX >= '2018'
#standardSQL
# 月の平均降水量
SELECT
AVG(prcp) AS average,
station_name,
date,
CURRENT_DATE() AS today,
DATE_DIFF(CURRENT_DATE(), date, DAY) AS partition_age,
EXTRACT(MONTH FROM date) AS month
FROM ecommerce.days_with_rain
WHERE station_name = 'WAKAYAMA' #日本
GROUP BY station_name, date, today, month, partition_age
ORDER BY date DESC; # 直近の日付順
タスク 6. partition_age が 60 日以下であることを確認する
ORDER BY 句を更新して、パーティションを古い順に表示します。
次のクエリを追加して実行します。
#standardSQL
# 月あたり平均降水量
SELECT
AVG(prcp) AS average,
station_name,
date,
CURRENT_DATE() AS today,
DATE_DIFF(CURRENT_DATE(), date, DAY) AS partition_age,
EXTRACT(MONTH FROM date) AS month
FROM ecommerce.days_with_rain
WHERE station_name = 'WAKAYAMA' #日本
GROUP BY station_name, date, today, month, partition_age
ORDER BY partition_age DESC
注: 気象データとパーティションは継続的に更新されるため、今後このクエリを再実行したときには結果は変わります。