Open SQL インターフェース

Looker の LookML セマンティック モデリング レイヤを使用すると、データ アナリストは SQL データベース内のディメンション、集計、計算、データのリレーションシップを定義できます。LookML モデルを使用することで、コードの再利用と Git との統合が可能になります。LookML モデルが適切に構造化されていると、ユーザーはセルフサービスのデータ探索とレポート作成を独自に行うことができます。

LookML モデルは、Looker からリクエストされるあらゆるデータの基盤となります。これは、リクエストが Looker UI の Looker Explore インターフェースから送られてくる場合であろうと、会社のポータルや別のサードパーティ アプリケーションに埋め込まれた可視化や、Looker API で開発されたカスタム アプリケーションから送られてくる場合であろうと同様です。Open SQL インターフェースを使用すると、Java Database Connectivity(JDBC)をサポートするサードパーティ アプリケーションから LookML モデルにアクセスできます。アプリケーションは、データベースであるかのように LookML モデルに接続できるため、ユーザーは使い慣れたツールを使用しながら、LookML モデルでデータ アナリストが行った作業をすべて活用できます。

Open SQL インターフェースが LookML プロジェクトの要素を表示する方法

Open SQL インターフェースが LookML プロジェクトの要素をどのように表示するかを理解するには、LookML プロジェクトの構造を理解する必要があります。

LookML プロジェクトは、SQL クエリを Looker 内で実行するために使われるオブジェクト、データベース接続、ユーザー インターフェース要素を記述するファイルのコレクションです(詳しくは LookML の用語とコンセプトをご覧ください)。次の LookML プロジェクト コンセプトは、Open SQL インターフェースに関連しています。

  • LookML モデルは、データベース接続と 1 つ以上の Explore を指定します。Open SQL インターフェースは、モデルをデータベース スキーマとして表示します。
  • Explore は、1 つ以上のビューの論理グループとそのビュー間の結合関係です。Open SQL インターフェースは、Explore をデータベース テーブルとして表示します。
  • ビューは、フィールド(ディメンションとメジャーの両方)のコレクションを定義します。ビューは通常、データベース内のテーブルまたは派生テーブルに基づいています。ビューには、基盤となるデータベース テーブルの列と、エンドユーザーが必要とするカスタム ディメンションまたはカスタム メジャーを含めることができます。Open SQL インターフェースは、ビュー名とフィールド名の組み合わせをデータベース列名として表示します。たとえば、order_items ビューの id ディメンションは、Open SQL インターフェースによって order_items.id というデータベース列として表示されます。

Looker Explore では、複数のビュー間の結合関係を定義できます。あるビューは、別のビューのフィールドと同じ名前のフィールドを持つことがあるため、Open SQL インターフェースでは、列を参照する際にビュー名とフィールド名の両方が含まれます。そのため、次の形式を使用して、Open SQL インターフェースにクエリを送信するときに列名を参照します。

`<view_name>.<field_name>`

たとえば、customer というビューを product というビューに結合する order_items という名前の Explore があり、その両方のビューに id ディメンションがある場合、2 つの id フィールドをそれぞれ `customer.id``product.id` として参照します。Explore 名でも完全修飾名を使用する場合は、2 つのフィールドを `order_items`.`customer.id``order_items`.`product.id` として参照します(データベース識別子を参照するときにバッククォートを配置する場所については、データベース識別子のバッククォートを使用するをご覧ください)。

Open SQL インターフェースの設定

Open SQL インターフェースを使用するには、次の手順を行います。

  1. 要件を満たしていることを確認する。
  2. Open SQL インターフェース JDBC ドライバ ファイルをダウンロードする

以降のセクションでは、これらの手順について説明します。

要件

Open SQL インターフェースを使用するには、次のコンポーネントが必要です。

  • 使用するサードパーティ アプリケーション(Tableau、ThoughtSpot、カスタマイズされたアプリケーションなど)が Looker インスタンスに接続できる必要があります。Looker インスタンスがサードパーティ アプリケーションからアクセスできるようにネットワーク接続されていれば、セルフホスト型 Looker インスタンスで Open SQL インターフェースを使用できます。
  • Google BigQuery 接続のデータを使用する LookML プロジェクト(LookML プロジェクトには、connection パラメータで Google BigQuery 接続を指定するモデルファイルが必要です)。
  • Open SQL インターフェースでアクセスする LookML モデルに対する explore 権限を含む Looker ユーザーロール

Open SQL インターフェース JDBC ドライバをダウンロードする

Looker Open SQL インターフェース JDBC ドライバは avatica-<release_number>-looker.jar と呼ばれます。GitHub の https://github.com/looker-open-source/calcite-avatica/releases から最新バージョンをダウンロードします。

JDBC ドライバは次の URL 形式を想定しています。

jdbc:looker:url=https://Looker instance URL

例:

jdbc:looker:url=https://myInstance.cloud.looker.com

JDBC ドライバのクラスは次のとおりです。

org.apache.calcite.avatica.remote.looker.LookerDriver

Open SQL インターフェースの認証

Open SQL インターフェースでは、次の 3 つの認証方法がサポートされています。

OAuth

OAuth をサポートする JDBC クライアントは、Looker インスタンスの OAuth サーバーを使用するように構成できます。OAuth 認証を構成する手順は次のとおりです。

  1. API Explorer 拡張機能を使用して、JDBC OAuth クライアントを Looker インスタンスに登録します。これにより、Looker インスタンスが OAuth リクエストを認識できるようになります。手順については、OAuth クライアント アプリケーションの登録をご覧ください。
  2. OAuth で Looker にログインして、アクセス トークンをリクエストします。例については、OAuth を使用してユーザー ログインを行うをご覧ください。
  3. Open SQL インターフェースへの JDBC 接続を開くときに、OAuth 認証情報を渡すには、プロパティ オブジェクトを使用します。

DriverManager#getConnection(<String>, <Properties>`) を使用した例を次に示します。

String access_token = getAccessToken() //uses the Looker OAuth flow to get a token
String URL = "jdbc:looker:url=https://myInstance.cloud.looker.com"
Properties info = new Properties( );
info.put("token", access_token);
Connection conn = DriverManager.getConnection(URL, info);

API キーを使用したアクセス トークンの生成

アクセス トークンの生成に標準の OAuth フローを使用する代わりに、次の手順に従って、Looker API を使用して Open SQL インターフェース JDBC ドライバに渡すことができるアクセス トークンを生成できます。

  1. 管理者設定 - ユーザーのページの説明に沿って、Looker ユーザーの API キーを生成します。
  2. Looker インスタンスの login API エンドポイントを使用します。レスポンスには、Authorization: token <access_token> 形式のアクセス トークンが含まれます。このリクエストを行うために使用できる curl コマンドの例を次に示します。

      curl -k -d "client_id=<client_id>&client_secret=<client_secret>" https://<looker_host>/login\
    
  3. Open SQL インターフェースへの JDBC 接続を開くときに OAuth 認証情報を渡すには、Properties オブジェクトでトークンとしてレスポンスの <access_token> 値を渡します。

API キー

API キーを使用して、ユーザー名とパスワードの代わりに認証を行うこともできます。API キーは OAuth よりも安全性が低いと判断され、Open SQL インターフェースのプレビュー中にのみ使用できます。Looker インスタンスの API キーの作成については、API キーをご覧ください。

Looker API キーのクライアント ID 部分をユーザー名として使用します。パスワードには [クライアント シークレット] 部分を使用します。

Open SQL インターフェースでのクエリの実行

Open SQL インターフェースを使用してクエリを実行する場合は、次のガイドラインに従ってください。

  • Open SQL インターフェースは、GoogleSQL 構文に準拠する SQL クエリを受け入れます。
  • Open SQL インターフェースでは、モデル、Explore、フィールド識別子をバッククォート(`)で囲む必要があります。詳細と例については、データベース識別子のバッククォートを使用するをご覧ください。
  • Open SQL インターフェースは、ほとんどの BigQuery 演算子をサポートしています。
  • Open SQL インターフェースでは、measure(バッククォートを含む)を特別な関数 AGGREGATE() でラップして、クエリに含まれる LookML measure を指定する必要があります。AGGREGATE() で LookML measure を指定するセクションをご覧ください。

SQL の制限事項

Open SQL インターフェースにクエリを送信する場合は、次の SQL の制限事項に注意してください。

データベース識別子のバッククォートを使用する

Open SQL インターフェースにクエリを送信する場合は、スキーマ、テーブル、列の識別子をバッククォートで囲みます。Looker の利用規約でバッククォートを使用してデータベース要素を指定する方法は次のとおりです。

  • スキーマ: `<model_name>`
  • テーブル: `<explore_name>`
  • 列: `<view_name>.<field_name>`

これらの要素を使用した SELECT ステートメントの形式の例を次に示します。

SELECT `view.field`
  FROM `model`.`explore`
  LIMIT 10;

AGGREGATE() で LookML measure を指定する

通常、データベース テーブルにはディメンションのみが含まれます。ディメンションは、テーブル内の行に関する単一の属性を記述するデータです。ただし、LookML プロジェクトでは、ディメンションとメジャーの両方を定義できます。メジャーは、複数の行にわたるデータの集計です(SUMAVGMINMAX など)(他のタイプのメジャーもサポートされています。サポートされている LookML メジャーのタイプの一覧については、メジャーのタイプのページをご覧ください)。

Open SQL インターフェースでは、measure(バッククォートを含む)を特別な関数 AGGREGATE() でラップして、クエリに含まれる LookML measure を指定する必要があります。たとえば、これを使用して、オーダー ビューから カウント メジャーを指定します。

AGGREGATE(`orders.count`)

LookML measure は、SELECT 句、HAVING 句、ORDER BY 句のいずれにあっても、AGGREGATE() 関数でラップする必要があります。

フィールドが LookML 測定値かどうかわからない場合は、DatabaseMetaData.getColumns メソッドを使用して LookML プロジェクトのメタデータにアクセスできます。IS_GENERATEDCOLUMN 列は、LookML メジャーの場合は YES、LookML ディメンションの場合は NO を示します。詳細については、データベース メタデータへのアクセスをご覧ください。

JSON_OBJECT を使用してフィルタ限定のフィールドとパラメータを指定する

Open SQL インターフェースは、パラメータフィルタ専用フィールドをサポートしています。

Open SQL インターフェースを使用してクエリを実行する場合、次の形式で JSON_OBJECT コンストラクタ呼び出しを含めることで、パラメータとフィルタ限定フィールドをクエリに適用できます。

JSON_OBJECT(
    '<view>.<parameter name>', '<parameter value>',
    '<view>.<filter name>', '<Looker filter expression>'
)

JSON オブジェクトには、0 個以上のフィルタ Key-Value ペアと 0 個以上のパラメータ Key-Value ペアを含めることができます。

  • JSON_OBJECT コンストラクタのキーは、フィルタ限定フィールドまたはパラメータの名前にする必要があります。
  • フィルタ限定のフィールドの場合、各キーの値は Looker 文字列フィルタ式である必要があります。
  • パラメータの場合、各キーの値は、parameter 定義で定義されている書式なし値でなければなりません。

Open SQL インターフェースでパラメータフィルタ限定のフィールドを使用する例については、以下のセクションをご覧ください。

パラメータの例

Open SQL インターフェースで parameter を使用する例として、customers ビューに Looker で次のように定義されたパラメータがあるとします。

parameter: segment {
  type: string
  allowed_value: {
    label: "Small (less than 500)"
    value: "small_customers"
  }
  allowed_value: {
    label: "Larger (greater than 10,000)"
    value: "large_customers"
  }
  allowed_value: {
    label: "Medium customers (Between 500 and 10,000)"
    value: "medium_customers"
  }
}

このクエリを Open SQL インターフェースに送信して、medium_customerssegment パラメータ値をクエリに適用できます。

SELECT `customers.segment_size`,
  AGGREGATE(`orders.total_amount`)
FROM `ecommerce`.`orders`(JSON_OBJECT(
    'customers.segment', 'medium_customers'
))
GROUP BY `customers.state`, `customers.city`
HAVING AGGREGATE(`orders.count`) > 10
ORDER BY 3 DESC LIMIT 5;

Open SQL インターフェースは、このパラメータ値を Looker のクエリに渡し、Looker は segment パラメータを使用するように構成されている Explore のすべてのフィールドに medium_customers 値を適用します。Looker でのパラメータの仕組みについては、parameter のドキュメントをご覧ください。

フィルタ限定フィールドの例

Open SQL インターフェースでは filter フィールドを使用できます。たとえば、products ビューにディメンションとフィルタ限定フィールドが Looker で次のように定義されているとします。

filter: brand_select {
  type: string
  }

dimension: brand_comparitor {
  sql:
    CASE
      WHEN {% condition brand_select %} ${products.brand_name} {% endcondition %}
      THEN ${products.brand_name}
      ELSE "All Other Brands"
    END ;;
    }

次のようなクエリを送信することで、Open SQL インターフェースで brand_select フィルタを使用できます。

SELECT `products.brand_comparator`, `products.number_of_brands`,
  AGGREGATE(`products.total_revenue`)
FROM `ecommerce`.`orders`(JSON_OBJECT(
    'products.brand_select', '%Santa Cruz%'
))
GROUP BY `products.brand_comparator`
ORDER BY 3 DESC LIMIT 5;

Open SQL インターフェースは、Looker 文字列フィルタ式 %Santa Cruz% を Looker のクエリに適用します。Looker でのフィルタ限定フィールドの仕組みについては、filter のドキュメントをご覧ください。

WHERE 句または HAVING 句で always_filter 値または conditionally_filter 値を指定する

Open SQL インターフェースは、always_filter または conditionally_filter のいずれかを含む Explore をサポートできますが、両方を含む Explore はサポートできません。

LookML Explore を always_filter または conditionally_filter で定義している場合は、SQL クエリのフィルタ フィールドの値を Open SQL インターフェースに渡す必要があります。

  • フィルタ定義で 1 つ以上のディメンションが指定されている場合は、フィルタ ディメンションごとに SQL クエリに WHERE 句を含める必要があります。
  • フィルタ定義で 1 つ以上のメジャーを指定する場合は、フィルタ メジャーごとに SQL クエリに HAVING 句を含める必要があります。

たとえば、country ディメンション、aircraft_category ディメンション、count 指標を指定する always_filter パラメータを使用して LookML Explore flights を定義した faa モデルがあるとします。

explore: flights {
  view_name: flights
  always_filter: {
    filters: [country : "Peru" , aircraft_category : "Airplane", count : ">1"]
  }
}

Open SQL インターフェースへのクエリでは、WHERE 句を使用してフィルタ ディメンションの値を渡し、HAVING 句を使用してメジャー フィルタの値を LookML モデルに渡す必要があります。次に例を示します。

SELECT
    `flights.make`
FROM
    `faa`.`flights`
      WHERE `flights.country` = 'Ecuador' AND `flights.aircraft_category` = 'Airplane'
      GROUP BY
          1
      HAVING `flights.count` > 2) 
LIMIT 5

always_filter パラメータで指定されたディメンションと指標のそれぞれにフィルタ値を渡さない場合、クエリはエラーを返します。conditionally_filter パラメータで指定されたディメンションとメジャーについても同様です。ただし、次のように unless サブパラメータを使用して conditionally_filter パラメータを定義できます。

explore: flights {
  view_name: flights
  conditionally_filter: {
    filters: [country : "Peru" , aircraft_category : "Airplane"]
    unless: [count]
  }
}

この場合、conditionally_filterfilters サブパラメータで指定されたディメンションと指標ごとにフィルタ値を渡す必要があります。ただし、unless サブパラメータのフィールドにフィルタを指定する場合は除きます。(unless サブパラメータの使用方法については、conditionally_filter のドキュメント ページをご覧ください)。

たとえば、Open SQL インターフェースに対する次のいずれかのクエリは有効です。最初のクエリは filters サブパラメータで指定されたフィールドのフィルタ値を返し、2 番目のクエリは unless サブパラメータで指定されたフィールドのフィルタ値を返します。

SELECT
    `flights.make`
FROM
    `faa`.`flights`
      WHERE `flights.country` = 'Ecuador' AND `flights.aircraft_category` = 'Airplane'
      
LIMIT 5
SELECT
    `flights.make`
FROM
    `faa`.`flights`
      GROUP BY
          1
      HAVING `flights.count` > 2

ディメンションとメジャーの両方を使用するクエリの例を次に示します。このクエリでは、顧客ビューから状態ディメンションと都市のディメンションを取得し、[注文] ビューから合計金額 メジャーを取得します。これらのビューはどちらも、ecommerce モデルの orders Explore に結合されています。注文が 10 件を超える都市の場合、このクエリ レスポンスで注文金額の上位 5 都市が表示されます。

SELECT `customers.state`, `customers.city`,
  AGGREGATE(`orders.total_amount`)
FROM `ecommerce`.`orders`
GROUP BY `customers.state`, `customers.city`
HAVING AGGREGATE(`orders.count`) > 10
ORDER BY 3 DESC LIMIT 5;

データベース メタデータへのアクセス

Open SQL インターフェースは、基盤となるデータベースに関する情報の取得に使用される標準 JDBC DatabaseMetaData インターフェースのサブセットをサポートしています。DatabaseMetaData インターフェースの次のメソッドを使用して、LookML モデルに関する情報を取得できます。

Open SQL インターフェースは、アクセスできるモデル、Explore、フィールドに対してのみ結果を返します。

DatabaseMetadata.getSchemas

次の表に、LookML モデルと標準データベース構造が、DatabaseMetadata.getSchemas インターフェース メソッドのレスポンスでどのように関連しているかを示します。

getSchemas レスポンス列 説明
TABLE_SCHEM LookML モデル名
TABLE_CATALOG (Null)

DatabaseMetadata.getTables

次の表に、LookML モデルとデータベース構造が、DatabaseMetaData.getTables インターフェース メソッドのレスポンスでどのように関連しているかを示します。レスポンスには、標準の JDBC メタデータと Looker 固有のメタデータが含まれます。

getTables レスポンス列 説明
JDBC 標準メタデータ
TABLE_CAT (Null)
TABLE_SCHEM LookML モデル名
TABLE_NAME LookML Explore の名前
TABLE_TYPE 常に値 TABLE_TYPE を返します。
REMARKS (Null)
TYPE_CAT (Null)
TYPE_SCHEM (Null)
TYPE_NAME テーブルのタイプを表す文字列。指定できるタイプは TABLEVIEWSYSTEM TABLEGLOBAL TEMPORARYLOCAL TEMPORARYALIASSYNONYM です。
SELF_REFERENCING_COL_NAME (Null)
REF_GENERATION (Null)
Looker 固有のメタデータ
DESCRIPTION Explore 説明
LABEL Explore ラベル
TAGS Explore タグ
CONDITIONALLY_FILTER_UNLESS Explore の conditionally_filter パラメータの unless サブパラメータのフィールドのリスト。unless サブパラメータで指定されたフィールドがない場合、またはエクスプローラに conditionally_filter パラメータが定義されていない場合、この値は null になります。

DatabaseMetadata.getColumns

次の表に、LookML モデルとデータベース構造が、DatabaseMetaData.getColumns インターフェース メソッドのレスポンスでどのように関連しているかを示します。レスポンスには、標準の JDBC メタデータと Looker 固有のメタデータが含まれます。

getColumns レスポンス列 説明
JDBC 標準メタデータ
TABLE_CAT (Null)
TABLE_SCHEM LookML モデル名
TABLE_NAME LookML Explore の名前
COLUMN_NAME `<view_name>.<field_name>` 形式の LookML フィールド名。例: `orders.amount`
DATA_TYPE 列の java.sql.Types コード。たとえば、Looker yesno フィールドは SQL 型コード 16(BOOLEAN)です。
TYPE_NAME 列のデータ型を表す文字列。ユーザー定義型(UDT)の場合、型名は完全修飾されます。
COLUMN_SIZE 列に格納できる最大文字数またはバイト数を表す整数。
BUFFER_LENGTH (Null)
DECIMAL_DIGITS データのスケールを表す整数。適用可能なデータ型の場合は小数点以下の桁数、または小数部の桁数。DECIMAL_DIGITS が適用されないデータ型の場合は、Null が返されます。
NUM_PREC_RADIX データの基数(通常は 10 または 2)を表す整数。
NULLABLE

null 値が許可されているかどうかを示す整数:

  • 0: columnNoNulls - NULL 値が許可されない場合があります
  • 1: columnNullable - NULL 値を確実に許可します
  • 2: columnNullableUnknown - null 値許容不明
REMARKS (Null)
COLUMN_DEF (Null)
SQL_DATA_TYPE (Null)
SQL_DATETIME_SUB (Null)
CHAR_OCTET_LENGTH 文字データ型の場合、列の最大バイト数を表す整数。
ORDINAL_POSITION Explore 内のフィールドの 1 から始まる序数(ビュー名、フィールド名ごとにディメンションと measure をアルファベット順で混合)
IS_NULLABLE 常に値 YES を返します。
SCOPE_CATALOG (Null)
SCOPE_SCHEMA (Null)
SCOPE_TABLE (Null)
SOURCE_DATA_TYPE (Null)
IS_AUTOINCREMENT (Null)
IS_GENERATEDCOLUMN measure の場合は YES、ディメンションの場合は NO
Looker 固有のメタデータ
DIMENSION_GROUP フィールドがディメンショングループの一部である場合は、ディメンショングループの名前。フィールドがディメンショングループの一部でない場合、この値は null になります。
DRILL_FIELDS ディメンションまたは measure に対して設定されたドリル フィールドのリスト(ある場合)
FIELD_ALIAS フィールドのエイリアス(存在する場合)
FIELD_CATEGORY フィールドが dimensionmeasure
FIELD_DESCRIPTION フィールドの説明
FIELD_GROUP_VARIANT フィールドがフィールドのグループラベルの下に表示される場合、FIELD_GROUP_VARIANT はグループラベルの下に表示されるフィールドの短い名前を指定します。
FIELD_LABEL フィールド ラベル
FIELD_NAME ディメンションまたは measure の名前
LOOKER_TYPE ディメンションまたは measure の LookML フィールド タイプ
REQUIRES_REFRESH_ON_SORT フィールドの値を再並べ替えするために SQL クエリを更新する必要があるか(TRUE)、または SQL クエリを更新を必要とせず、フィールドの値を再並べ替えできるかどうか(FALSE)。
SORTABLE フィールドを並べ替えられる(TRUE)か、並べ替えることができない(FALSE)か
TAGS フィールド tags
USE_STRICT_VALUE_FORMAT フィールドで strict value formatを使用している(TRUE)かしていない(FALSE)か
VALUE_FORMAT フィールドの Value format 文字列
VIEW_LABEL フィールドの View label
VIEW_NAME LookML プロジェクトでフィールドが定義されているビューの名前
HIDDEN Explore のフィールド ピッカーでフィールドが非表示であるか(TRUE)、または Explore のフィールド ピッカーにフィールドが表示されているか(FALSE)。
ALWAYS_FILTER フィールドに設定されている always_filter パラメータのデフォルト値。フィールドが always_filter パラメータの一部でない場合、この値は null です。
CONDITIONALLY_FILTER フィールドに設定されている conditionally_filter パラメータのデフォルト値。フィールドが conditionally_filter パラメータの一部でない場合、この値は null です。

Looker UI での Open SQL インターフェース クエリの特定

Looker 管理者は Looker UI を使用して、Open SQL インターフェースから発信されたクエリを特定できます。

  • クエリ管理ページでは、Open SQL インターフェースからのクエリの Source の値は「SQL Interface」になります。[User] の値には、クエリを実行した Looker ユーザーの名前が表示されます。クエリの [詳細] ボタンをクリックすると、そのクエリに関する追加情報が表示されます。[詳細] ダイアログで [SQL インターフェースのクエリ] をクリックすると、Open SQL インターフェースから Looker に送信された SQL クエリを確認できます。
  • System Activity Explore の履歴 で、Open SQL インターフェースからのクエリの [Source] の値は「sql_interface」になります。[User Email] の値には、クエリを実行した Looker ユーザーのメールアドレスが表示されます。次の URL の冒頭に Looker インスタンスのアドレスを挿入すると、[sql_interface] でフィルタされた [History] Explore に直接移動できます。

    https://Looker instance URL/explore/system__activity/history?fields=history.source,history.completed_date&f[history.source]=%22sql_interface%22
    

サードパーティの依存関係のリポジトリ

次のリンクから、Looker JDBC ドライバで使用されるサードパーティ依存関係の Google Cloud がホストするリポジトリにアクセスできます。

https://third-party-mirror.googlesource.com/looker_sql_interface/+/refs/heads/master/third_party/