質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

289閲覧

(Google Cloud PlatformのCompute Engineでシェルスクリプトを使い)SQL(BigQuery)を操作する際、日別でテーブルを作成する方法について

SatoshiMaruyama

総合スコア16

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/08/29 09:41

編集2022/01/12 10:55

シェルスクリプトについての質問です。
最下部にサンプルコードの掲載しました。

シェルでループを回し、”一日毎に”(BigQueryを操作して)日別のテーブルを作成したいと考えております。
*(BigQueryの)記述内容に関して、日付指定の箇所以外は同様のもの

上記、日付部分を操作する為、以下のイメージを考えてます。

1.テーブル作成する為のクエリーをシェルでループ処理
2.ただし、上記の「指定日付のみ」ループ毎に変わっていく

具体的には、以下の通りです。

1.のシェル内に、2.の変数を入れてループ処理する。

上記を実現する為のシェルスクリプトはどのように記述すれば宜しいでしょうか?

また、上記以外でも、目的を実現できる方法があればご教授ください。

現状は、以下のように「■■」内にSQL(BigQuery)をベタ書きしています。
(*指定日付のみ変数で対応)

ベタ書き以外で、もっとキレイな書き方があれば、ご教授ください。
どうぞよろしくお願いします。

#!/bin/sh for i in `seq 0 3` do echo "i = $i" GetDateTime08=`date -d "$i days ago" '+%Y%m%d'` echo $GetDateTime08 bq query --use_legacy_sql=false --replace --allow_large_results --destination_table=■テーブル名■_$GetDateTime08 \ ' --■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ SQL(BigQuery)をベタ書き --■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ' done

【補足1】
今回、実現したいテーブルは、日を跨いで集計するテーブルではなく、
その前段階として、「日別でログ保存するテーブル」となります。

上記のテーブルに対してFROM句を使い、必要な期間を「*(ワイルドカード)」で指定する仕様です。

例)
FROM Table名_20*
WHERE _TABLE_SUFFIX > "2018-08-01"

この仕様にするメリットは、全期間が保存されたテーブルを(WHERE句で)絞り込む必要がなく、
必要な期間のみ、FROM句で呼び出す為、非常に軽くなります。

なお、日別でテーブル作成する場合、BigQuery側の保存形式は(VIEW形式ではなく)テーブル形式となります。
(最終的に、日を跨いで集計するテーブルはVIEW形式)

今回、扱っているデータは、(顧客情報など時間の経過によって変化するものではなく)Googleアナリティクスのデータであり、
1日毎にテーブル形式で保存してしまっても影響が、ほぼ無いと考えた為です。

ご説明不足で失礼しました。
引き続きどうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

根本的な疑問ですが、なぜ日付別にテーブルを作る必要があるのでしょうか。

ふつうのSQLで考えれば、テーブルに「日付」列を追加して、日付別にデータを取りたければその列で絞り込む、というような構造を取るものです。日付などで切ってテーブルを増やすのは、アンチパターンにも分類されます。

投稿2018/08/29 10:05

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatoshiMaruyama

2018/08/30 01:05

ご回答ありがとうございます。【補足1】を追記しました。引き続きよろしくお願いします。
guest

0

通常の業務では日付をまたがって集計する要件ってごく普通にありますから、テーブルに日付カラムを保持して日付の範囲を指定して実行します。
日毎にデータを保持して、翌日、3日間、翌月、翌年にデータが跨った場合に対応できるか考えてみては?

投稿2018/08/29 10:28

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatoshiMaruyama

2018/08/30 01:05

ご回答ありがとうございます。【補足1】を追記しました。引き続きよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問