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

とある調査であるカラムを含むテーブルをリストアップしなくてはいけなくて、途中まで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.system_schema."columns"
WHERE
  keyspace_name = 'my_keyspace'
  AND column_name IN ('email', 'address')
;

system.system_schemaにメタデータがあったけど、このクエリは失敗する。

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

CQLがSQLと似ているからと言って、RDSのようにはうまくいかなくてまだやり方はよくわかってない。Casssandraは難しい。