CREATE TABLE
StarRocks で新しいテーブルを作成します。
この操作を行うには、対象データベースに対する CREATE TABLE 権限が必要です。
構文
CREATE [EXTERNAL] [TEMPORARY] TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...]
[, index_definition1[, index_definition12,]])
[ENGINE = [olap|mysql|elasticsearch|hive|hudi|iceberg|jdbc]]
[key_desc]
[COMMENT "table comment"]
[partition_desc]
[distribution_desc]
[rollup_index]
[ORDER BY (column_name1,...)]
[PROPERTIES ("key"="value", ...)]
[BROKER PROPERTIES ("key"="value", ...)]
パラメータ
- 作成するテーブル名、パーティション名、列名、インデックス名は、System limits の命名規則に従う必要があります。
- データベース名、テーブル名、列名、またはパーティション名を指定する際、StarRocks では一部のリテラルが予約キーワードとして使用されます。これらのキーワードを SQL ステートメントで直接使用しないでください。SQL ステートメントでそのようなキーワードを使用したい場合は、バッククォート (`) で囲んでください。これらの予約キーワードについては、Keywords を参照してください。
column_definition
構文:
col_name col_type [agg_type] [NULL | NOT NULL] [DEFAULT "default_value"] [AUTO_INCREMENT] [AS generation_expr]
col_name: 列名。
通常、__op
または __row
で始まる名前の列を作成することはできません。これらの名前形式は StarRocks で特別な目的のために予約されており、そのような列を作成すると未定義の動作を引き起こす可能性があります。そのような列を作成する必要がある場合は、FE 動的パラメータ allow_system_reserved_names
を TRUE
に設定してください。
col_type: 列の型。具体的な列情報、型や範囲など:
-
TINYINT (1 バイト): -2^7 + 1 から 2^7 - 1 までの範囲。
-
SMALLINT (2 バイト): -2^15 + 1 から 2^15 - 1 までの範囲。
-
INT (4 バイト): -2^31 + 1 から 2^31 - 1 までの範囲。
-
BIGINT (8 バイト): -2^63 + 1 から 2^63 - 1 までの範囲。
-
LARGEINT (16 バイト): -2^127 + 1 から 2^127 - 1 までの範囲。
-
FLOAT (4 バイト): 科学的記数法をサポート。
-
DOUBLE (8 バイト): 科学的記数法をサポート。
-
DECIMAL[(precision, scale)] (16 バイト)
-
デフォルト値: DECIMAL(10, 0)
-
precision: 1 ~ 38
-
scale: 0 ~ precision
-
整数部分: precision - scale
科学的記数法はサポートされていません。
-
-
DATE (3 バイト): 0000-01-01 から 9999-12-31 までの範囲。
-
DATETIME (8 バイト): 0000-01-01 00:00:00 から 9999-12-31 23:59:59 までの範囲。
-
CHAR[(length)]: 固定長文字列。範囲: 1 ~ 255。デフォルト値: 1。
-
VARCHAR[(length)]: 可変長文字列。デフォルト値は 1。単位: バイト。StarRocks 2.1 より前のバージョンでは、
length
の値の範囲は 1–65533 です。[プレビュー] StarRocks 2.1 以降のバージョンでは、length
の値の範囲は 1–1048576 です。 -
HLL (1~16385 バイト): HLL 型の場合、長さやデフォルト値を指定する必要はありません。長さはデータ集約に応じてシステム内で制御されます。HLL 列は hll_union_agg、Hll_cardinality、および hll_hash によってのみクエリまたは使用できます。
-
BITMAP: ビットマップ型は指定された長さやデフォルト値を必要としません。これは符号なし bigint 数の集合を表します。最大の要素は 2^64 - 1 まで可能です。
agg_type: 集約タイプ。指定されていない場合、この列はキー列です。指定されている場合、それは値列です。サポートされている集約タイプは次のとおりです:
- SUM, MAX, MIN, REPLACE
- HLL_UNION (HLL 型のみ)
- BITMAP_UNION (BITMAP のみ)
- REPLACE_IF_NOT_NULL: これは、インポートされたデータが非 NULL 値の場合にのみ置き換えられることを意味します。NULL 値の場合、StarRocks は元の値を保持します。
NOTE
- 集約タイプ BITMAP_UNION の列がインポートされるとき、その元のデータ型は TINYINT、SMALLINT、INT、および BIGINT でなければなりません。
- テーブル作成時に REPLACE_IF_NOT_NULL 列に NOT NULL が指定されている場合、StarRocks はデータを NULL に変換してもユーザーにエラーレポートを送信しません。これにより、ユーザーは選択した列をインポートできます。
この集約タイプは、キータイプが AGGREGATE KEY である集計テーブルにのみ適用されます。v3.1.9 以降、REPLACE_IF_NOT_NULL
は BITMAP 型の列を新たにサポートします。
NULL | NOT NULL: 列が NULL
を許可するかどうか。デフォルトでは、重複キーテーブル、集計テーブル、またはユニークキーテーブルを使用するテーブル内のすべての列に対して NULL
が指定されます。主キーテーブルを使用するテーブルでは、デフォルトで値列には NULL
が指定され、キー列には NOT NULL
が指定されます。生データに NULL
値が含まれている場合は、\N
で表現してください。StarRocks はデータロード中に \N
を NULL
として扱います。
DEFAULT "default_value": 列のデフォルト値。StarRocks にデータをロードする際、列にマッピングされたソースフィールドが空の場合、StarRocks は自動的にデフォルト値をその列に入力します。デフォルト値を指定する方法は次のとおりです:
- DEFAULT current_timestamp: 現在の時刻をデフォルト値として使用します。詳細は current_timestamp() を参照してください。
- DEFAULT
<default_value>
: 列データ型の指定された値をデフォルト値として使用します。たとえば、列のデータ型が VARCHAR の場合、DEFAULT "beijing"
のように、デフォルト値として beijing という VARCHAR 文字列を指定できます。デフォルト値は次の型のいずれかであってはなりません: ARRAY、BITMAP、JSON、HLL、および BOOLEAN。 - DEFAULT (<expr>): 指定された関数の結果をデフォルト値として使用します。サポートされているのは uuid() と uuid_numeric() のみです。
AUTO_INCREMENT: AUTO_INCREMENT
列を指定します。AUTO_INCREMENT
列のデータ型は BIGINT でなければなりません。自動インクリメント ID は 1 から始まり、1 ずつ増加します。AUTO_INCREMENT
列の詳細については、AUTO_INCREMENT を参照してください。v3.0 以降、StarRocks は AUTO_INCREMENT
列をサポートします。
AS generation_expr: 生成列とその式を指定します。生成列 は、式の結果を事前に計算して保存するために使用でき、同じ複雑な式を含むクエリを大幅に高速化します。v3.1 以降、StarRocks は生成列をサポートします。
index_definition
INDEX index_name (col_name[, col_name, ...]) [USING BITMAP] COMMENT 'xxxxxx'
パラメータの説明と使用上の注意については、ビットマップインデックス を参照してください。
ENGINE type
デフォルト値: olap
。このパラメータが指定されていない場合、デフォルトで OLAP テーブル (StarRocks 内部テーブル) が作成されます。
オプション値: mysql
、elasticsearch
、hive
、jdbc
(2.3 以降)、iceberg
、および hudi
(2.2 以降)。外部データソースをクエリするための外部テーブルを作成する場合は、CREATE EXTERNAL TABLE
を指定し、ENGINE
をこれらのいずれかの値に設定します。詳細については、外部テーブル を参照してください。
Hive、Iceberg、Hudi、および JDBC データソースからデータをクエリするには、カタログを使用することをお勧めします。外部テーブルは非推奨です。
v3.1 以降、StarRocks は Iceberg カタログで Parquet 形式のテーブルを作成することをサポートし、INSERT INTO を使用してこれらの Parquet 形式の Iceberg テーブルにデータを挿入できます。
v3.2 以降、StarRocks は Hive カタログで Parquet 形式のテーブルを作成することをサポートし、INSERT INTO を使用してこれらの Parquet 形式の Hive テーブルにデータを挿入できます。v3.3 以降、StarRocks は Hive カタログで ORC および Textfile 形式のテーブルを作成することをサポートし、INSERT INTO を使用してこれらの ORC および Textfile 形式の Hive テーブルにデータを挿入できます。
-
MySQL の場合、次のプロパティを指定します:
PROPERTIES (
"host" = "mysql_server_host",
"port" = "mysql_server_port",
"user" = "your_user_name",
"password" = "your_password",
"database" = "database_name",
"table" = "table_name"
)注意:
MySQL の "table_name" は実際のテーブル名を示す必要があります。対照的に、CREATE TABLE ステートメントの "table_name" は StarRocks 上のこの MySQL テーブルの名前を示します。これらは異なる場合も同じ場合もあります。
StarRocks で MySQL テーブルを作成する目的は、MySQL データベースにアクセスすることです。StarRocks 自体は MySQL データを維持または保存しま せん。
-
Elasticsearch の場合、次のプロパティを指定します:
PROPERTIES (
"hosts" = "http://192.168.0.1:8200,http://192.168.0.2:8200",
"user" = "root",
"password" = "root",
"index" = "tindex",
"type" = "doc"
)hosts
: Elasticsearch クラスタに接続するために使用される URL。1 つ以上の URL を指定できます。user
: 基本認証が有効な Elasticsearch クラスタにログインするために使用されるルートユーザーのアカウント。password
: 前述のルートアカウントのパスワード。index
: Elasticsearch クラスタ内の StarRocks テーブルのインデックス。インデックス名は StarRocks テーブル名と同じです。このパラメータを StarRocks テーブルのエイリアスに設定できます。type
: インデックスタイプ。デフォルト値はdoc
です。
-
Hive の場合、次のプロパティを指定します:
PROPERTIES (
"database" = "hive_db_name",
"table" = "hive_table_name",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
)ここで、database は Hive テーブル内の対応するデータベースの名前です。table は Hive テーブルの名前です。
hive.metastore.uris
はサーバーアドレスです。 -
JDBC の場合、次のプロパティを指定します:
PROPERTIES (
"resource"="jdbc0",
"table"="dest_tbl"
)resource
は JDBC リソース名で、table
は宛先テーブルです。 -
Iceberg の場合、次のプロパティを指定します:
PROPERTIES (
"resource" = "iceberg0",
"database" = "iceberg",
"table" = "iceberg_table"
)resource
は Iceberg リ ソース名です。database
は Iceberg データベースです。table
は Iceberg テーブルです。 -
Hudi の場合、次のプロパティを指定します:
PROPERTIES (
"resource" = "hudi0",
"database" = "hudi",
"table" = "hudi_table"
)
key_desc
構文:
key_type(k1[,k2 ...])
データは指定されたキー列で順序付けされ、異なるキータイプに対して異なる属性を持ちます:
- AGGREGATE KEY: キー列内の同一の内容は、指定された集約タイプに従って値列に集約されます。通常、財務報告書や多次元分析などのビジネスシナリオに適用されます。
- UNIQUE KEY/PRIMARY KEY: キー列内の同一の内容は、イン ポート順に従って値列に置き換えられます。キー列の追加、削除、変更、クエリに適用できます。
- DUPLICATE KEY: キー列内の同一の内容は、StarRocks に同時に存在します。詳細データや集約属性のないデータを保存するために使用できます。DUPLICATE KEY はデフォルトのタイプです。データはキー列に従って順序付けされます。
NOTE
AGGREGATE KEY を除いて、他の key_type を使用してテーブルを作成する場合、値列に集約タイプを指定する必要はありません。
COMMENT
テーブルを作成する際に、テーブルコメントを追加することができます(オプション)。COMMENT は key_desc
の後に配置する必要があります。それ以外の場合、テーブルは作成されません。
v3.1 以降、ALTER TABLE <table_name> COMMENT = "new table comment"
を使用してテーブルコメントを変更できます。
partition_desc
パーティションの説明は次の方法で使用できます:
パーティションを動的に作成する
動的パーティション化 は、パーティションのタイムトゥリブ(TTL)管理を提供します。StarRocks はデータの新鮮さを確保するために、新しいパーティションを事前に自動的に作成し、期限切れのパーティションを削除します。この機能を有効にするには、テーブル作成時に動的パーティション化関連のプロパティを設定します。
パーティションを一つずつ作成する
パーティションの上限のみを指定する
構文:
PARTITION BY RANGE ( <partitioning_column1> [, <partitioning_column2>, ... ] )
PARTITION <partition1_name> VALUES LESS THAN ("<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] )
[ ,
PARTITION <partition2_name> VALUES LESS THAN ("<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] )
, ... ]
)
注意:
指定されたキー列と指定された値の範囲を使用してパーティション化してください。
-
パーティションの命名規則については、System limits を参照してください。
-
v3.3.0 より前は、レンジパーティション化の列は TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE、および DATETIME のみをサポートしていました。v3.3.0 以降、3 つの特定の時間関数をレンジパーティション化の列として使用できます。詳細な使用方法については、Data distribution を参照してください。
-
パーティショ ンは左閉右開です。最初のパーティションの左境界は最小値です。
-
NULL 値は最小値を含むパーティションにのみ保存されます。最小値を含むパーティションが削除されると、NULL 値はインポートできなくなります。
-
パーティション列は単一の列または複数の列にすることができます。パーティション値はデフォルトの最小値です。
-
パーティション列として 1 つの列のみを指定する場合、最新のパーティションのパーティション列の上限として
MAXVALUE
を設定できます。PARTITION BY RANGE (pay_dt) (
PARTITION p1 VALUES LESS THAN ("20210102"),
PARTITION p2 VALUES LESS THAN ("20210103"),
PARTITION p3 VALUES LESS THAN MAXVALUE
)
注意してください:
- パーティションは、時間に関連するデータを管理するためによく使用されます。
- データのバックトラッキングが 必要な場合、必要に応じてパーティションを追加するために最初のパーティションを空にすることを検討するかもしれません。
パーティションの下限と上限の両方を指定する
構文:
PARTITION BY RANGE ( <partitioning_column1> [, <partitioning_column2>, ... ] )
(
PARTITION <partition_name1> VALUES [( "<lower_bound_for_partitioning_column1>" [ , "<lower_bound_for_partitioning_column2>", ... ] ), ( "<upper_bound_for_partitioning_column1?" [ , "<upper_bound_for_partitioning_column2>", ... ] ) )
[,
PARTITION <partition_name2> VALUES [( "<lower_bound_for_partitioning_column1>" [ , "<lower_bound_for_partitioning_column2>", ... ] ), ( "<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] ) )
, ...]
)
注意:
-
固定範囲は LESS THAN よりも柔軟です。左と右のパーティションをカスタマイズできます。
-
固定範囲は他の点では LESS THAN と同じです。
-
パーティション列として 1 つの列のみを指定する場合、最新のパーティションのパーティション列の上限として
MAXVALUE
を設定できます。PARTITION BY RANGE (pay_dt) (
PARTITION p202101 VALUES [("20210101"), ("20210201")),
PARTITION p202102 VALUES [("20210201"), ("20210301")),
PARTITION p202103 VALUES [("20210301"), (MAXVALUE))
)
バッチで複数のパーティションを作成する
構文
-
パーティション列が日付型の場合。
PARTITION BY RANGE (<partitioning_column>) (
START ("<start_date>") END ("<end_date>") EVERY (INTERVAL <N> <time_unit>)
) -
パーティション列が整数型の場合。
PARTITION BY RANGE (<partitioning_column>) (
START ("<start_integer>") END ("<end_integer>") EVERY (<partitioning_granularity>)
)
説明
START()
と END()
で開始値と終了値を指定し、EVERY()
で時間単位またはパーティショングラニュラリティを指定して、バッチで複数のパーティションを作成できます。
- v3.3.0 より前は、レンジパーティション化の列は TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE、および DATETIME のみをサポートしていました。v3.3.0 以降、3 つの特定の時間関数をレンジパーティション化の列として使用できます。詳細な使用方法については、Data distribution を参照してください。
- パーティション列が日付型の場合、
INTERVAL
キーワードを使用して時間間隔を指定する必要があります。時間単位として hour (v3.0 以降)、day、week、month、または year を指定できます。パーティションの命名規則は動的パーティションと同じです。
詳細については、Data distribution を参照してください。
distribution_desc
StarRocks はハッシュバケット法とランダムバケット法をサポートしています。バケット法を設定しない場合、StarRocks はデフォルトでランダムバケット法を使用し、バケット数を自動的に設定します。
-
ランダムバケット法 (v3.1 以降)
パーティション内のデータについて、StarRocks はすべてのバケットにランダムにデータを分配します。特定の列値に基づいていません。StarRocks にバケット数を自動的に設定させたい場合は、バケット設定を指定する必要はありません。バケット数を手動で指定する場合の構文は次のとおりです:
DISTRIBUTED BY RANDOM BUCKETS <num>
ただし、ランダムバケット法によって提供されるクエリパフォーマンスは、大量のデータをクエリし、特定の列を条件列として頻繁に使用する場合には理想的ではないかもしれません。このシナリオでは、ハッシュバケット法を使用することをお勧めします。スキャンおよび計算が必要なバケットの数が少なくなり、クエリパフォーマンスが大幅に向上します。
注意事項
- ランダムバケット法は重複キーテーブルの作成にのみ使用できます。
- ランダムにバケットされたテーブルには Colocation Group を指定できません。
- Spark Load を使用してランダムにバケットされたテーブルにデータをロードすることはできません。
- StarRocks v2.5.7 以降、テーブルを作成する際にバケット数を設定する必要はありません。StarRocks はバケット数を自動的に設定します。このパラメータを設定したい場合は、Set the number of buckets を参照してください。
詳細については、Random bucketing を参照してください。
-
ハッシュバケット法
構文:
DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]
パーティション内のデータは、バケット列のハッシュ値とバケット数に基づいてバケットに細分化されます。次の 2 つの要件を満たす列をバケット列として選択すること をお勧めします。
- 高いカーディナリティを持つ列(例: ID)
- クエリでフィルタとしてよく使用される列
そのような列が存在しない場合は、クエリの複雑さに応じてバケット列を決定できます。
- クエリが複雑な場合は、バケット列として高いカーディナリティを持つ列を選択して、バケット間でのデータ分布のバランスを確保し、クラスタリソースの利用率を向上させることをお勧めします。
- クエリが比較的単純な場合は、クエリ条件としてよく使用される列をバケット列として選択して、クエリ効率を向上させることをお勧めします。
1 つのバケット列を使用してパーティションデータを均等に分配できない場合は、複数のバケット列(最大 3 つ)を選択できます。詳細については、Choose bucketing columns を参照してください。
注意事項:
- テーブルを作成する際に、バケット列を指定する必要があります。
- バケット列の値は更新できません。
- バケット列は指定後に変更できません。
- StarRocks v2.5.7 以降、テーブルを作成する際にバケット数を設定する必要はありません。StarRocks はバケット数を自動的に設定します。このパラメータを設定したい場合は、Set the number of buckets を参照してください。
ORDER BY
v3.0 以降、主キーテー ブルは ORDER BY
を使用してソートキーを定義することをサポートしています。v3.3 以降、重複キーテーブル、集計テーブル、およびユニークキーテーブルは ORDER BY
を使用してソートキーを定義することをサポートしています。
ソートキーの詳細については、Sort keys and prefix indexes を参照してください。
TEMPORARY
一時テーブルを作成します。v3.3.1 以降、StarRocks は Default Catalog での一時テーブルの作成をサポートしています。詳細については、Temporary Table を参照してください。
一時テーブルを作成する際には、ENGINE
を olap
に設定する必要があります。
PROPERTIES
初期記憶媒体、ストレージクールダウン時間、自動レプリカ数を指定する
エンジンタイプが OLAP
の場合、テーブル作成時に初期記憶媒体 (storage_medium
)、自動ストレージクールダウン時間 (storage_cooldown_time
) または時間間隔 (storage_cooldown_ttl
)、およびレプリカ数 (replication_num
) を指定できます。
プロパティが有効になる範囲: テーブルにパーティションが 1 つしかない場合、プロパティはテーブルに属します。テーブルが複数のパーティションに分割されている場合、プロパティは各パーティションに属します。指定されたパーティションに異なるプロパティを設定する必要がある場合は、テーブル作成後に ALTER TABLE ... ADD PARTITION または ALTER TABLE ... MODIFY PARTITION を実行できます。
初期記憶媒体と自動ストレージクールダウン時間を設定する
PROPERTIES (
"storage_medium" = "[SSD|HDD]",
{ "storage_cooldown_ttl" = "<num> { YEAR | MONTH | DAY | HOUR } "
| "storage_cooldown_time" = "yyyy-MM-dd HH:mm:ss" }
)