Databricksでカラム名に半角スペースが入ってしまうと気付きにくい

# はじめに

株式会社NTTデータ [デジタルサクセスソリューション事業部](https://enterprise-aiiot.nttdata.com/) の [nttd-saitouyun](https://qiita.com/nttd-saitouyun) です。

最近は社内外からDatabricksの問い合わせが増えており、デモをする機会が増えてきています。
その中でタイトルの点について、かなり些細なことではありますが、気づきがあったので本書で共有します。





# 半角スペースの扱い
まず、Databricksのオブジェクトにおける半角スペースの扱いを説明します。半角スペースをテーブル名やカラム名に使うことがあまりなかった（アンダースコア派）ので意識してきませんでした。いま一度まとめてみます。

まず、**カタログ、スキーマ、テーブル、ボリュームの名前には半角スペースは使えません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/031a7da8-4622-fa0c-5f03-51e7be5b3974.png)

一方で、**カラム名には半角スペースを使用することができます**。意図的に半角スペースを入れているのであればよいのですが、GUIでテーブルを作成するときに意図せず半角スペースが入ってしまうケースもあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/59f08724-6724-1027-dbdb-5837446c3def.png)
※データはダミーデータで、以後も同様です。テーブル名はdummyとします。





# 半角スペースを含むカラム名

それでは、以下のように、３パターンのカラムを用意してみました。
1. カラム名の先頭に半角スペースがある場合（nameカラム）
1. カラム名の中に半角スペースがある場合（name hiraganaカラム）
1. カラム名の末尾に半角スペースがある場合（ageカラム）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/c821193e-d9dc-518f-169b-e2118bcbc914.png)

3つ目のパターンはコピペミスなど意図せずこのようなカラム名になってしまう場合が多そうです。（私はやってしまいました。）



# 半角スペースが入ってしまうと気づきにくい理由

ズバリ、**UI上に表示されるカラム名は前後の半角スペースがトリムされて表示されています**。そのため、カタログを見ただけだと、意図した通りのカラム名が設定できているように見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/d12dfd4d-9f6e-8e6f-d51e-0ddba015b8f4.png)

また、**データプロファイルの実行、UIからのカラムフィルタなどの基本的な機能はすべて正常に動作します**。システムの動作上はカラム名はシステムとして正しく、\` name\`、\`name hiragana\`、\`age \`と半角スペース入りで認識されており、UIだけの問題のようです。



なので、**UIの表示名を元にSQLを実行するとエラーになってしまいます**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/9508a57f-db68-915f-4a7b-bb8c352ff252.png)

\` name\`と半角スペース込みでカラム名を指定すれば正しくSQLを実行できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/34ee437f-1809-b8c1-da5f-f4d22d7de669.png" width="400">

ちなみに、PySpark のデータフレームでスキーマ定義を見てみると、こちらは先頭に半角スペースがある場合（パターン1）は半角スペースが消えてます。
うーん、なぜなのか・・・


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/de036764-b6e1-e437-fd79-bc050dbb203e.png)


## 半角スペースに入っていることに気が付くには？

そのまんまですが、UIの表示名を当てにしないことです。（とはいえ、エラーになればメッセージですぐに気が付くことができると思います。）

「列名をコピー」からカラム名を取得すると正しく半角スペースを含んだ状態でカラム名を取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/57501dca-8da3-2f30-de59-ff8132138451.png)

また、PySparkも `printSchema()`を使えば正しくカラム名を取得できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/a3ae80fe-185e-e4ae-c1df-99078bc70f0a.png" width="400">

または、Databricks Assistant（生成AI）を活用することです。半角スペースなしのカラム名で指示をしても正しく半角スペースありでSQLを書いてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/528a90ad-dd89-8cc9-fb73-27db9667b7da.png)


# カラム名を修正する

`RENAME COLUMN`構文で修正ができます。こちらも AI に修正をお願いしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/6cd9a549-97da-a117-df08-dee1072d5db3.png)

**半角スペースの位置に応じて適切な修正案が提案されました！**
先頭・末尾の半角スペースは消えて、単語中の半角スペースはアンダースコアに変換されています。かしこい！


## カラム名を変更するときの注意点

### 制約などが削除される

マニュアルにある通りです。以下の点に注意してください！

https://docs.databricks.com/ja/sql/language-manual/sql-ref-syntax-ddl-alter-table-manage-column.html#rename-column-clause

>カラムやフィールドの名前を変更すると、依存するチェック制約や生成されたカラムも変更する必要があります。そのカラムを使用している主キーと外部キーはすべて削除されます。外部キーの場合、外部キーが定義されているテーブルを所有しなければなりません。


## タグが削除される

これは検証をしていて気が付きました。**マニュアルにも明示はされていないようです**。
**カラム名を変えるとタグも消えるようです。なぜか末尾の半角スペースを消した場合（パターン３）だけはタグが残りました**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/a26aeb50-dcdc-14da-91e9-be5f8fb0be1f.png)

カラムのタグの情報は、`<your_catalog_name>.information_schema.column_tags`テーブルに保存されているので事前にバックアップしておきましょう。

<br>

※試してみましたが、**テーブルやボリュームは名前を変えてもタグは残りました**。





# おわりに
かなり細かい論点でしたが、UIの仕様を知らなかったので記事にしてみました！
また、カラム名の変更時の注意点についても新発見がありました。

本記事が、皆さんが**ハマらないための道しるべ**となれば幸いです。




# 仲間募集
NTTデータ デザイン＆テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary> 1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア) </summary>
クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary> 2. データサイエンス領域（データサイエンティスト／データアナリスト） </summary>
データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary> 3.お客様のAI活用の成功を推進するAIサクセスマネージャー </summary>
DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary> 4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》 </summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>

# ソリューション紹介
<details><summary> Trusted Data Foundationについて </summary>
～データ資産を分析活用するための環境をオールインワンで提供するソリューション～

https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</details>

<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

 https://enterprise-aiiot.nttdata.com/service/databricks

</details>

<details><summary> TDF-AM（Trusted Data Foundation - Analytics Managed Service）について </summary>
～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～

https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDF-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</details>

</details>

<details><summary> NTTデータとSnowflakeについて </summary>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。
NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake

</details>

</details>

<details><summary> NTTデータとInformaticaについて </summary>
データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。

https://enterprise-aiiot.nttdata.com/service/informatica

</details>

</details>

<details><summary> NTTデータとTableauについて </summary>
ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。

https://enterprise-aiiot.nttdata.com/service/tableau

</details>

</details>

<details><summary> NTTデータとAlteryxについて </summary>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。
Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://enterprise-aiiot.nttdata.com/service/alteryx

</details>

</details>

<details><summary> NTTデータとDataRobotについて </summary>
DataRobotは、包括的なAIライフサイクルプラットフォームです。
NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot

</details>