技術的背景と対応方法
Hiveテーブルを作成する際、メンテナンスを容易にするために、各フィールドやテーブルに中国語のコメントを追加することが一般的です。以下はその一例です。
CREATE EXTERNAL TABLE `example_table`(
col_id STRING COMMENT '識別番号',
type_code INT COMMENT 'タイプ')
COMMENT 'テスト用テーブル'
PARTITIONED BY (
partition_day INT)
LOCATION '/data/example';
このコードを実行した後、一部の環境で文字化けが発生します。
使用環境
| ソフトウェア | バージョン |
|---|
| CDH | 5.15.1 |
| Hive | 1.1.0-cdh5.15.1 |
原因分析
HiveのメタデータはMySQL、Oracle、PostgreSQL、MS SQL Serverといったデータベースに保存されます。今回のケースではMySQLを使用しており、特定のテーブル構造が影響しています。
以下は主な関連テーブルの一覧です。
| テーブル名 | 説明 | 関連キー |
|---|
| TABLE_INFO | Hiveテーブルの基本情報(表名、作成日、所有者等) | TBL_ID,SD_ID |
| TABLE_ATTR | テーブル属性(外部表か否か、コメント、最終更新日等) | TBL_ID |
| COLUMN_DATA | Hiveテーブルのフィールド情報(フィールドコメント、名前、型、順序) | SD_ID |
| DATA_DIRS | Hiveテーブルおよびパーティションに対応するHDFSディレクトリとフォーマット | SD_ID,SERDE_ID |
| SERDE_SETTINGS | シリアライズ・デシリアライズ設定(行区切り記号、列区切り記号、NULL表現等) | SERDE_ID |
| PARTITION_INFO | Hiveテーブルのパーティション情報(所属テーブル、値) | PART_ID,SD_ID,TBL_ID |
| PARTITION_KEYS | Hiveテーブルのパーティションキー(フィールド) | TBL_ID |
| PARTITION_VALUES | Hiveテーブルのパーティション名(キー値) | PART_ID |
| INDEX_DETAILS | インデックスのフィールド情報 | INDEX_ID |
解決策
以下のSQLコマンドを実行することで、問題を解決できます。
-- フィールドコメントとテーブルコメントの修正
ALTER TABLE COLUMN_META MODIFY COLUMN COMMENT VARCHAR(256) CHARACTER SET utf8;
ALTER TABLE TABLE_META MODIFY COLUMN PARAM_VALUE VARCHAR(4000) CHARACTER SET utf8;
-- パーティションフィールドコメントの修正
ALTER TABLE PARTITION_META MODIFY COLUMN PARAM_VALUE VARCHAR(4000) CHARACTER SET utf8;
ALTER TABLE PARTITION_KEYS MODIFY COLUMN KEY_COMMENT VARCHAR(4000) CHARACTER SET utf8;
-- インデックスコメントの修正
ALTER TABLE INDEX_META MODIFY COLUMN PARAM_VALUE VARCHAR(4000) CHARACTER SET utf8;
再びテーブルを作成し、`SHOW CREATE TABLE example_table`を実行すると、正常なコメントが確認できます。