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", ...)]
キーワード
EXTERNAL
EXTERNAL キーワードは非推奨です。
Hive、Iceberg、Hudi、JDBC データソースからデータをクエリするには、EXTERNAL キーワードを使用して外部テーブルを作成するのではなく、external catalogs を使用することをお勧めします。
推奨事項
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 テーブルにデータをシンクすることをサポートしています。
非推奨の EXTERNAL キーワードを使用したい場合は、EXTERNAL キーワードの詳細を展開してください。
EXTERNAL キーワードの詳細
外部データソースをクエリするための外部テーブルを作成するには、CREATE EXTERNAL TABLE を指定し、ENGINE を次のいずれかの値に設定します。詳細については、External table を参照してください。
-
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.xx.xx:8200,http://192.168.xx0.xx:8200",
"user" = "root",
"password" = "root",
"index" = "tindex",
"type" = "doc"
)hosts: Elasticsearch クラスタに接続するために使用される URL。1 つ以上の URL を指定できます。user: 基本認証が有効な Elasticsearch クラスタにログインするために使用される root ユーザーのアカウント。password: 上記の root アカウントのパスワード。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"
)
TEMPORARY
一時テーブルを作成します。v3.3.1 から、StarRocks は Default Catalog での一時テーブルの作成をサポートしています。詳細については、Temporary Table を参照してください。
一時テーブルを作成する際には、ENGINE を olap に設定する必要があります。
列定義
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,REPLACEHLL_UNION(HLLタイプのみ)BITMAP_UNION(BITMAPのみ)REPLACE_IF_NOT_NULL: これは、インポートされたデータが非ヌル値の場合にのみ置き換えられることを意味します。ヌル値の場合、StarRocks は元の値を保持します。
- 集計タイプ BITMAP_UNION の列がインポートされるとき、その元のデータタイプは TINYINT、SMALLINT、INT、および BIGINT でなければなりません。
- テーブル作成時に REPLACE_IF_NOT_NULL 列で NOT NULL が指定されている場合、StarRocks はデータを NULL に変換し、ユーザーにエラーレポートを送信しません。これにより、ユーザーは選択した列をインポートできます。
この集計タイプは、key_desc タイプが 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 index_name (col_name[, col_name, ...]) [USING BITMAP] COMMENT 'xxxxxx'
パラメータの説明と使用上の注意については、ビットマップインデックス を参照してください。
ENGINE
デフォルト値: olap。このパラメータが指定されていない場合、デフォルトで OLAP テーブル (StarRocks 内部テーブル) が作成されます。
オプションの値: mysql, elasticsearch, hive, jdbc, iceberg, および hudi。
キー
構文:
key_type(k1[,k2 ...])
データは指定されたキー列で順序付けされ、異なるキータイプに対して異なる属性を持ちます:
-
AGGREGATE KEY: キー列の同一内容は、指定された集計タイプに従って値列に集約されます。通常、財務報告書や多次元分析などのビジネスシナリオに適用されます。
-
UNIQUE KEY/PRIMARY KEY: キー列の同一内容は、インポート順序に従って値列に置き換えられます。キー列の追加、削除、変更、クエリに適用できます。
-
DUPLICATE KEY: StarRocks に同時に存在するキー列の同一内容。詳細データや集計属性のないデータを保存するために使用できます。
注記DUPLICATE KEY はデフォルトのタイプです。データはキー列に従って順序付けされます。
AGGREGATE KEY を除く他の key_type を使用してテーブルを作成す る場合、値列は集計タイプを指定する必要はありません。
COMMENT
テーブル作成時にテーブルコメントを追加できます(オプション)。COMMENT は key_desc の後に配置する必要があることに注意してください。そうしないと、テーブルは作成されません。
v3.1 以降、ALTER TABLE <table_name> COMMENT = "new table comment" を使用してテーブルコメントを変更できます。
パーティション
パーティションは次の方法で管理できます:
パーティションを動的に作成する
動的パーティション化 は、パーティションの有効期限管理 (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>", ... ] )
, ... ]
)
指定されたキー列と指定された値範囲を使用してパーティション化してください。
-
パーティションの命名規則については、システム制限 を参照してください。
-
v3.3.0 より前は、レンジパーティション化の列は TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE、および DATETIME のみをサポートしています。v3.3.0 以降、3 つの特定の時間関数をレンジパーティション化の列として使用できます。詳細な使用法については、データ分布 を参照してください。
-
パーティションは左閉右開です。最初のパーティションの左境界は最小値です。
-
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 つの特定の時間関数をレンジパーティション化の列として使用できます。詳細な使用法については、データ分布 を参照してください。
- パーティション列が日付型の場合、
INTERVALキーワードを使用して時間間隔を指定する必要があります。時間単位として、時間 (v3.0 以降)、日、週、月、年を指定できます。パーティションの命名規則は動的パーティションと同じです。
詳細については、データ分布 を参照してください。
ディストリビューション
StarRocks はハッシュバケット法とランダムバケット法をサポートしています。バケット法を設定しない場合、StarRocks はランダムバケット法を使用し、デフォルトでバケット数を自動的に設定します。
-
ランダムバケット法 (v3.1 以降)
パーティション内のデータに対して、StarRocks は特定の列値に基づかずにデータをすべてのバケットにランダムに分散します。StarRocks にバケット数を自動的に設定させたい場合、バケット設定を指定する必要はあ りません。バケット数を手動で指定する場合、構文は次のとおりです:
DISTRIBUTED BY RANDOM BUCKETS <num>ただし、ランダムバケット法によって提供されるクエリパフォーマンスは、大量のデータをクエリし、特定の列を条件列として頻繁に使用する場合には理想的でない可能性があります。このようなシナリオでは、ハッシュバケット法を使用することをお勧めします。スキャンおよび計算が必要なバケットの数が少ないため、クエリパフォーマンスが大幅に向上します。
注意事項
- ランダムバケット法は重複キーテーブルの作成にのみ使用できます。
- ランダムにバケットされたテーブルには Colocation Group を指定できません。
- Spark Load を使用してランダムにバケットされたテーブルにデータをロードすることはできません。
- StarRocks v2.5.7 以降、テーブル作成時にバケット数を設定する必要はありません。StarRocks は自動的にバケット数 を設定します。このパラメータを設定したい場合は、バケット数の設定 を参照してください。
詳細については、ランダムバケット法 を参照してください。
-
ハッシュバケット法
構文:
DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]パーティション内のデータは、バケット列のハッシュ 値とバケット数に基づいてバケットに細分化されます。次の 2 つの要件を満たす列をバケット列として選択することをお勧めします。
- 高いカーディナリティを持つ列(例: ID)
- クエリでフィルタとしてよく使用される列
そのような列が存在しない場合は、クエリの複雑さに応じてバケット列を決定できます。
- クエリが複雑な場合、バケット列として高いカーディナリティを持つ列を選択して、バケット間のデータ分布を均等にし、クラスタリソースの利用率を向上させることをお勧めします。
- クエリが比較的単純な場合、クエリ条件として頻繁に使用される列をバケット列として選択して、クエリ効率を向上させることをお勧めします。
1 つのバケット列を使用してもパーティションデータが各バケットに均等に分配されない場合、複数のバケット列 (最大 3 つ) を選択できます。詳細については、バケット列の選択 を参照してください。
注意事項:
- テーブルを作成する際、バケット列を指定する必要があります。
- バケット列の値は更新できません。
- バケット列は指定後に変更できません。
- StarRocks v2.5.7 以降、テーブル作成時にバケット数を設定する必要はありません。StarRocks は自動的にバケット数を設定します。このパラメータを設定したい場合は、バケット数の設定 を参照してください。
ロールアップインデックス
テーブル作成時に一括でロールアップを作成できます。
構文:
ROLLUP (rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)],...)
ORDER BY
v3.0 以降、主キーテーブルは ORDER BY を使用してソートキーを定義することをサポートしています。v3.3 以降、重複キーテーブル、集計テーブル、およびユニークキーテーブルは ORDER BY を使用してソートキーを定義することをサポートしています。
ソートキーの詳細については、ソートキーとプレフィックスインデックス を参照してください。