あるカラムをもつテーブルを探すには

とある調査であるカラムを含むテーブルをリストアップしなくてはいけなくて、途中までschema.rbなどを眺めていたんだけど、途中から効率的なやり方があったのでメモをしておく。

以下、emailまたはaddressというカラムをもつテーブルをリストアップしたいとする。

MySQL

SELECT
  *
FROM
  information_schemas.COLUMNS
WHERE
  COLUMN_NAME IN ('email', 'address')
;

information_schemasデータベースにメタデータがある。

BigQuery

SELECT
  *
FROM
  my_project.INFORMATION_SCHEMA.COLUMNS
WHERE
  column_name IN ('email', 'address')
;

beta版だけどBigQueryにもメタデータを含むデータセットがある。

Hive

おそらくこれがブログに残したかった最大の理由。

SELECT
  SDS.SD_ID,
  TBLS.TBL_NAME,
  COLUMNS_V2.`COLUMN_NAME`
FROM
  SDS
  JOIN TBLS USING (SD_ID)
  JOIN COLUMNS_V2 USING (CD_ID)
WHERE
  COLUMNS_V2.`COLUMN_NAME` IN ('email', 'address')
;

Hive metastoreへのクエリでHiveテーブルのメタデータを取得できる。COLUMNS_V2テーブルにはどのテーブルのカラムかという情報が(なぜか)ない。

いろいろ調べた結果、SDSという謎テーブルにjoinすることでテーブル名も取得できることがわかった。

Cassandra

SELECT
  *
FROM
  system_schema.columns
WHERE
  keyspace_name = 'my_keyspace'
  AND column_name IN 'email'
ALLOW FILTERING
;

system_schema.columnsにメタデータがある。ALLOW FILTERINGをつけないと以下のようなエラーが出るので注意。

Query 1 ERROR: PRIMARY KEY column "column_name" cannot be restricted as preceding column "table_name" is not restricted