# HiveのCREATE TABLE文の構文

`CREATE TABLE`文は、Treasure Data CDPのデータベースに、指定したスキーマで新しいテーブルを定義します。データエンジニアは、Trinoに切り替えることなくHiveQLから直接テーブルを作成するために使用します（例: データ取り込みワークフローやスケジュールクエリの実行前）。

Note
このページでは、Hiveクエリエンジンでサポートされる`CREATE TABLE`の構文について説明します。TrinoクエリエンジンでもCREATE TABLEはサポートされていますが、構文や機能は異なります。

## 構文

```sql
CREATE TABLE [IF NOT EXISTS] [<database_name>.]<table_name> (
  <column_name> <data_type> [COMMENT '<column_comment>'],
  ...
)
[COMMENT '<table_comment>']
[TBLPROPERTIES ('<key>' = '<value>', ...)]
```

各項目について:

- <table_name> は作成するテーブルの名前です。
- <data_type> はカラムのデータ型です。[サポートされるデータ型](#supported-data-types)を参照してください。
- `IF NOT EXISTS` は、同名のテーブルが既に存在する場合に発生するエラーを抑制します。
- `COMMENT` は、カラムまたはテーブルの任意の説明を設定します。
- `TBLPROPERTIES` は、任意のテーブルプロパティを設定します。[サポートされるテーブルプロパティ](#supported-table-properties)を参照してください。


## 例

基本的なテーブルを作成する例:

```sql
CREATE TABLE my_database.users (
  user_id BIGINT,
  name STRING,
  score DOUBLE
);
```

テーブルが存在しない場合のみ、カラムおよびテーブルのコメント付きで作成する例:

```sql
CREATE TABLE IF NOT EXISTS users (
  user_id BIGINT COMMENT 'Unique identifier',
  email STRING COMMENT 'User email address'
)
COMMENT 'User master table';
```

`expire_days`でデータ保持期間を設定する例:

```sql
CREATE TABLE user_events (
  user_id BIGINT,
  event_type STRING,
  created_at BIGINT
)
TBLPROPERTIES (
  'comment' = 'User event tracking table',
  'expire_days' = '90'
);
```

ユーザー定義パーティショニング(UDP)でデータを分散する例:

```sql
CREATE TABLE user_events (
  user_id BIGINT,
  session_id STRING,
  event_type STRING
)
TBLPROPERTIES (
  'udp.bucket_count' = '128',
  'udp.bucketed_on' = 'user_id,session_id'
);
```

## テーブルスキーマのコピー (CREATE TABLE LIKE)

`LIKE`句を使用すると、既存テーブルのスキーマをコピーした新しいテーブルを作成できます。コピーされるのはテーブル構造のみで、データはコピーされません。

```sql
CREATE TABLE [IF NOT EXISTS] <new_table_name> LIKE <source_table_name>;
```

元テーブルのカラム定義に加え、`expire_days`やユーザー定義パーティショニング(UDP)設定などのテーブルプロパティが新しいテーブルにコピーされます。元テーブルは事前に存在している必要があり、存在しない場合はエラーになります。

## サポートされるデータ型

Hiveのデータ型は、以下のようにTreasure Data CDPのカラム型にマッピングされます。記載されていない型はサポートされません。

| Hive型 | CDPカラム型 | 備考 |
|  --- | --- | --- |
| `STRING`, `VARCHAR(n)`, `CHAR(n)` | `string` | 長さの制約は無視されます。 |
| `BIGINT` | `long` |  |
| `INT`, `INTEGER`, `SMALLINT`, `TINYINT` | `long` |  |
| `DOUBLE`, `FLOAT` | `double` |  |
| `ARRAY<type>` | `array` |  |


## サポートされるテーブルプロパティ

以下のプロパティのみが処理されます。それ以外のプロパティは通知なく無視されます。

| プロパティ | 型 | 説明 |
|  --- | --- | --- |
| `comment` | String | テーブルの説明です。テーブルレベルの`COMMENT`句と同等です。 |
| `expire_days` | Integer | この日数を経過したデータが自動的に削除されます。正の整数である必要があります。 |
| `udp.bucket_count` | Integer | ユーザー定義パーティショニングのバケット数です。4から4096までの2のべき乗である必要があります。 |
| `udp.bucketed_on` | String | バケット対象カラムのカンマ区切りリストです。最大3カラムまで指定でき、テーブルスキーマに存在し、かつ`time`カラムを含めることはできません。 |


Note
`udp.bucket_count`と`udp.bucketed_on`は、両方を指定するか、どちらも指定しないかのいずれかである必要があります。ユーザー定義パーティショニングの詳細については、[ユーザー定義パーティショニング(UDP)](/ja/products/customer-data-platform/data-workbench/queries/sql-reference/udp)ページを参照してください。

## 制限事項

### マネージドテーブルのみ

CREATE TABLEはマネージドテーブルを作成します。`EXTERNAL`句による外部テーブルの作成はサポートされません。

### サポートされない句

以下の句はサポートされておらず、エラーとして拒否されます:

- `TEMPORARY`
- `EXTERNAL`
- `PARTITIONED BY`
- `CLUSTERED BY` / `SORTED BY` / `INTO ... BUCKETS`
- `ROW FORMAT`
- `STORED AS`
- `LOCATION`


### CREATE TABLE AS SELECT (CTAS)

クエリ結果からテーブルを作成する`CREATE TABLE AS SELECT`はサポートされません。CTAS のサポートは今後のリリースで予定されています。