[メモ]BigQueryのカラム名のハイフンで少しだけ困った

BigQueryのカラム名でハイフンで少しだけ困りました。
2023.05.10

クラスメソッド株式会社データアナリティクス事業本部所属のニューシロです。 今回はBigQueryのカラム名を扱っている中で少し困ったことを書いてみました。

きっかけ

Python上で書いたSQLを用いてBigQueryでのデータ操作を行うコードを書いていたところ、うまく動作しませんでした。 実際にBigQueryでSQLを書いてわかったのですが、カラム名のハイフンが原因でした。

本題

Python上で以下のようなコードを書いていました。

query = """
    SELECT
      *,
      ROW_NUMBER() OVER (
        PARTITION BY post-id
        ORDER BY pubDate DESC
      ) as row_num 
    FROM
      `{}`
    """.format(table_id)

取得したRSS情報の操作をするコードの一部です。クエリは簡略化しております。
post-idはINTEGER型、pubDateはTIMESTAMP型です。

このクエリのミスは、実際にBigQueryでSQLを動かすことでわかりました。

post-idというカラム名に問題があるようです。 ハイフン以降が認識されていません。

とりあえずバッククォートで囲みました。これでBigQuery上でも元のPythonのコード上でも動作しました。
テーブル名は元々バッククォートで囲んでおりましたが、カラム名は特に意識せず今までそのまま書いておりました。

一旦解決ですが、この件について色々と調べてみました。

調べてみた

公式ドキュメントから調べてみました。

列名には、英字(a ~ z、A ~ Z)、数字(0 ~ 9)、アンダースコア(_)を使用できます。列名の先頭は英字またはアンダースコアにする必要があります。

つまり、そもそもカラム名にハイフンは使えないということになります。
いや、でもそもそもテーブル作成時に、post-idというハイフン入りのカラム名を指定できたからこそ、このテーブルが存在できているはずです。
なぜだろう、、と思っていたら、直後に以下の文章がありました。

英語以外の言語の文字へのアクセスの拡張、記号の追加など、列名の柔軟性が向上しました。
柔軟な列名は次の文字をサポートしています。
Unicode 正規表現 \p{L} で表される任意の言語の任意の文字。
Unicode 正規表現 \p{N} で表される任意の言語の任意の数字。
Unicode 正規表現 \p{Pc} で表される任意のコネクタ区切り記号文字(アンダースコアを含む)。
Unicode 正規表現 \p{Pd} で表されるハイフンまたはダッシュ。
Unicode 正規表現 \p{M} で表される、別の文字に付随して使用するための任意のマーク(アクセント記号、傘、囲み記号など)。

最近BigQueryのカラム名に日本語が利用可能になったことを知っていましたが、他にも利用できる記号が増えていたようです。ハイフンも使えるようになっております。ただし、こちらはまだプレビュー版の機能ということです。

以前はそもそもカラム名にハイフンは利用できなかったのか、BigQueryの学習歴が浅いのでそこはわかりませんが、特に自分が扱っている技術に関するリリースノートはきちんと読んでおくべきですね。
ちなみにバッククォートで囲む理由としては以下のリンクにあります。

レガシー SQL では、予約済みキーワードと、スペース()やハイフン(-)などの無効な文字が含まれる識別子を角括弧([])を使用してエスケープします。GoogleSQL では、キーワードと識別子をバッククォート(`)を使用してエスケープします。

色々と調べてみると、どうやら他のDBでもバッククォートで囲むという解決法はよくあるようですね。
私は初めて知ったので、ここにメモとして残しておきます。

追加の対応策

カラム名にハイフンを用いる機能はプレビュー版ですので、実際のシステムには入れるわけにはいきません。
ハイフンをアンダーバーに変え、post_idに変更しておきます。

まとめ

  • リリースノートはきちん読んでおきましょう。
  • 無効な識別子はバッククォートで囲みましょう。

以上です。ここまでお読みいただきありがとうございました。

引用・参照まとめ