|
| 1 | +--- |
| 2 | +displayed_sidebar: docs |
| 3 | +--- |
| 4 | + |
| 5 | +# 辞書マッピング |
| 6 | + |
| 7 | +辞書テーブル内の指定されたキーにマッピングされた値を返します。 |
| 8 | + |
| 9 | +この関数は、主にグローバル辞書テーブルの適用を簡素化するために使用されます。ターゲットテーブルへのデータロード中に、StarRocksはこの関数の入力パラメータを使用して、辞書テーブルから指定されたキーにマッピングされた値を自動的に取得し、その値をターゲットテーブルにロードします。 |
| 10 | + |
| 11 | +:::note |
| 12 | + |
| 13 | +- v3.2.5以降、StarRocksはこの関数をサポートしています。 |
| 14 | +- 現在、StarRocksの共有データモードはこの関数をサポートしていません。 |
| 15 | + |
| 16 | +::: |
| 17 | + |
| 18 | +## 構文 |
| 19 | + |
| 20 | +```SQL |
| 21 | +dict_mapping("[<db_name>.]<dict_table>", key_column_expr_list [, <value_column> ] [, <null_if_not_exist>] ) |
| 22 | + |
| 23 | +key_column_expr_list ::= key_column_expr [, key_column_expr ... ] |
| 24 | + |
| 25 | +key_column_expr ::= <column_name> | <expr> |
| 26 | +``` |
| 27 | + |
| 28 | +## パラメータ |
| 29 | + |
| 30 | +- 必須パラメータ: |
| 31 | + - `[<db_name>.]<dict_table>`: 辞書テーブルの名前。プライマリキーテーブルである必要があります。サポートされるデータ型はVARCHARです。 |
| 32 | + - `key_column_expr_list`: 辞書テーブルのキー列の式リスト。1つまたは複数の`key_column_exprs`を含みます。`key_column_expr`は、辞書テーブルのキー列の名前、または特定のキーやキー式であることができます。 |
| 33 | + |
| 34 | + この式リストには、辞書テーブルのすべてのプライマリキー列を含める必要があります。つまり、式の総数は辞書テーブルのプライマリキー列の総数と一致する必要があります。したがって、辞書テーブルが複合プライマリキーを使用する場合、このリストの式は、テーブルスキーマで定義されたプライマリキー列に順序通りに対応する必要があります。このリスト内の複数の式はカンマ (`,`) で区切られます。また、`key_column_expr`が特定のキーまたはキー式である場合、その型は辞書テーブルの対応するプライマリキー列の型と一致する必要があります。 |
| 35 | + |
| 36 | +- オプションパラメータ: |
| 37 | + - `<value_column>`: 値列の名前。これはマッピング列でもあります。値列が指定されていない場合、デフォルトの値列は辞書テーブルのAUTO_INCREMENT列です。値列は、自動インクリメント列とプライマリキーを除く辞書テーブル内の任意の列として定義することもできます。列のデータ型に制限はありません。 |
| 38 | + - `<null_if_not_exist>` (オプション): キーが辞書テーブルに存在しない場合に何を返すか。有効な値: |
| 39 | + - `true`: キーが存在しない場合、Nullが返されます。 |
| 40 | + - `false` (デフォルト): キーが存在しない場合、例外がスローされます。 |
| 41 | + |
| 42 | +## 戻り値 |
| 43 | + |
| 44 | +戻り値のデータ型は、値列のデータ型と一貫しています。値列が辞書テーブルの自動インクリメント列である場合、戻り値のデータ型はBIGINTです。 |
| 45 | + |
| 46 | +ただし、指定されたキーにマッピングされた値が見つからない場合、`<null_if_not_exist>`パラメータが`true`に設定されていると、`NULL`が返されます。パラメータが`false`(デフォルト)に設定されている場合、エラー`query failed if record not exist in dict table`が返されます。 |
| 47 | + |
| 48 | +## 例 |
| 49 | + |
| 50 | +**例1: 辞書テーブルからキーにマッピングされた値を直接クエリします。** |
| 51 | + |
| 52 | +1. 辞書テーブルを作成し、シミュレートされたデータをロードします。 |
| 53 | + |
| 54 | + ```SQL |
| 55 | + MySQL [test]> CREATE TABLE dict ( |
| 56 | + order_uuid STRING, |
| 57 | + order_id_int BIGINT AUTO_INCREMENT |
| 58 | + ) |
| 59 | + PRIMARY KEY (order_uuid) |
| 60 | + DISTRIBUTED BY HASH (order_uuid); |
| 61 | + Query OK, 0 rows affected (0.02 sec) |
| 62 | + |
| 63 | + MySQL [test]> INSERT INTO dict (order_uuid) VALUES ('a1'), ('a2'), ('a3'); |
| 64 | + Query OK, 3 rows affected (0.12 sec) |
| 65 | + {'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'} |
| 66 | + |
| 67 | + MySQL [test]> SELECT * FROM dict; |
| 68 | + +------------+--------------+ |
| 69 | + | order_uuid | order_id_int | |
| 70 | + +------------+--------------+ |
| 71 | + | a1 | 1 | |
| 72 | + | a3 | 3 | |
| 73 | + | a2 | 2 | |
| 74 | + +------------+--------------+ |
| 75 | + 3 rows in set (0.01 sec) |
| 76 | + ``` |
| 77 | + |
| 78 | + > **注意** |
| 79 | + > |
| 80 | + > 現在、`INSERT INTO`ステートメントは部分更新をサポートしていません。したがって、`dict`のキー列に挿入される値が重複しないようにしてください。そうしないと、辞書テーブルに同じキー列の値を複数回挿入すると、値列のマッピングされた値が変更されます。 |
| 81 | +
|
| 82 | +2. 辞書テーブル内のキー`a1`にマッピングされた値をクエリします。 |
| 83 | + |
| 84 | + ```SQL |
| 85 | + MySQL [test]> SELECT dict_mapping('dict', 'a1'); |
| 86 | + +----------------------------+ |
| 87 | + | dict_mapping('dict', 'a1') | |
| 88 | + +----------------------------+ |
| 89 | + | 1 | |
| 90 | + +----------------------------+ |
| 91 | + 1 row in set (0.01 sec) |
| 92 | + ``` |
| 93 | + |
| 94 | +**例2: テーブル内のマッピング列が`dict_mapping`関数を使用して生成列として構成されています。これにより、StarRocksはこのテーブルにデータをロードする際に、キーにマッピングされた値を自動的に取得できます。** |
| 95 | + |
| 96 | +1. データテーブルを作成し、`dict_mapping('dict', order_uuid)`を使用してマッピング列を生成列として構成します。 |
| 97 | + |
| 98 | + ```SQL |
| 99 | + CREATE TABLE dest_table1 ( |
| 100 | + id BIGINT, |
| 101 | + -- この列にはSTRING型の注文番号が記録されており、例1のdictテーブルのorder_uuid列に対応しています。 |
| 102 | + order_uuid STRING, |
| 103 | + batch int comment 'used to distinguish different batch loading', |
| 104 | + -- この列には、order_uuid列にマッピングされたBIGINT型の注文番号が記録されています。 |
| 105 | + -- この列はdict_mappingで構成された生成列であるため、データロード中に例1のdictテーブルから値が自動的に取得されます。 |
| 106 | + -- その後、この列は重複排除およびJOINクエリに直接使用できます。 |
| 107 | + order_id_int BIGINT AS dict_mapping('dict', order_uuid) |
| 108 | + ) |
| 109 | + DUPLICATE KEY (id, order_uuid) |
| 110 | + DISTRIBUTED BY HASH(id); |
| 111 | + ``` |
| 112 | + |
| 113 | +2. `order_id_int`列が`dict_mapping('dict', 'order_uuid')`として構成されているこのテーブルにシミュレートされたデータをロードする際、StarRocksは`dict`テーブル内のキーと値のマッピング関係に基づいて、`order_id_int`列に値を自動的にロードします。 |
| 114 | + |
| 115 | + ```SQL |
| 116 | + MySQL [test]> INSERT INTO dest_table1(id, order_uuid, batch) VALUES (1, 'a1', 1), (2, 'a1', 1), (3, 'a3', 1), (4, 'a3', 1); |
| 117 | + Query OK, 4 rows affected (0.05 sec) |
| 118 | + {'label':'insert_e191b9e4-8a98-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'72'} |
| 119 | + |
| 120 | + MySQL [test]> SELECT * FROM dest_table1; |
| 121 | + +------+------------+-------+--------------+ |
| 122 | + | id | order_uuid | batch | order_id_int | |
| 123 | + +------+------------+-------+--------------+ |
| 124 | + | 1 | a1 | 1 | 1 | |
| 125 | + | 4 | a3 | 1 | 3 | |
| 126 | + | 2 | a1 | 1 | 1 | |
| 127 | + | 3 | a3 | 1 | 3 | |
| 128 | + +------+------------+-------+--------------+ |
| 129 | + 4 rows in set (0.02 sec) |
| 130 | + ``` |
| 131 | + |
| 132 | + この例での`dict_mapping`の使用は、[重複排除計算とJOINクエリを高速化できます。](../../../using_starrocks/query_acceleration_with_auto_increment.md)精密な重複排除を高速化するためのグローバル辞書を構築する以前のソリューションと比較して、`dict_mapping`を使用するソリューションは、より柔軟でユーザーフレンドリーです。なぜなら、マッピング値は「キーと値のマッピング関係をテーブルにロードする」段階で辞書テーブルから直接取得されるからです。マッピング値を取得するために辞書テーブルを結合するステートメントを記述する必要はありません。さらに、このソリューションはさまざまなデータロード方法をサポートしています。 |
| 133 | + |
| 134 | +**例3: テーブル内のマッピング列が生成列として構成されていない場合、テーブルにデータをロードする際に、マッピング列に対して`dict_mapping`関数を明示的に構成し、キーにマッピングされた値を取得する必要があります。** |
| 135 | + |
| 136 | +> **注意** |
| 137 | +> |
| 138 | +> 例3と例2の違いは、データテーブルにインポートする際に、インポートコマンドを変更して、マッピング列の`dict_mapping`式を明示的に構成する必要があることです。 |
| 139 | +
|
| 140 | +1. テーブルを作成します。 |
| 141 | + |
| 142 | + ```SQL |
| 143 | + CREATE TABLE dest_table2 ( |
| 144 | + id BIGINT, |
| 145 | + order_uuid STRING, |
| 146 | + order_id_int BIGINT NULL, |
| 147 | + batch int comment 'used to distinguish different batch loading' |
| 148 | + ) |
| 149 | + DUPLICATE KEY (id, order_uuid, order_id_int) |
| 150 | + DISTRIBUTED BY HASH(id); |
| 151 | + ``` |
| 152 | + |
| 153 | +2. シミュレートされたデータがこのテーブルにロードされる際、`dict_mapping`を構成することで、辞書テーブルからマッピングされた値を取得します。 |
| 154 | + |
| 155 | + ```SQL |
| 156 | + MySQL [test]> INSERT INTO dest_table2 VALUES (1, 'a1', dict_mapping('dict', 'a1'), 1); |
| 157 | + Query OK, 1 row affected (0.35 sec) |
| 158 | + {'label':'insert_19872ab6-8a96-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'42'} |
| 159 | + |
| 160 | + MySQL [test]> SELECT * FROM dest_table2; |
| 161 | + +------+------------+--------------+-------+ |
| 162 | + | id | order_uuid | order_id_int | batch | |
| 163 | + +------+------------+--------------+-------+ |
| 164 | + | 1 | a1 | 1 | 1 | |
| 165 | + +------+------------+--------------+-------+ |
| 166 | + 1 row in set (0.02 sec) |
| 167 | + ``` |
| 168 | + |
| 169 | +**例4: null_if_not_existモードを有効にする** |
| 170 | + |
| 171 | +`<null_if_not_exist>`モードが無効で、辞書テーブルに存在しないキーにマッピングされた値がクエリされた場合、`NULL`ではなくエラーが返されます。これにより、データ行のキーが最初に辞書テーブルにロードされ、そのマッピング値(辞書ID)が生成されてから、そのデータ行がターゲットテーブルにロードされることが保証されます。 |
| 172 | + |
| 173 | +```SQL |
| 174 | +MySQL [test]> SELECT dict_mapping('dict', 'b1', true); |
| 175 | +ERROR 1064 (HY000): Query failed if record not exist in dict table. |
| 176 | +``` |
| 177 | + |
| 178 | +**例5:ディクショナリテーブルが複合主キーを使用している場合、クエリ時にはすべての主キーを指定する必要があります。** |
| 179 | + |
| 180 | +1. 複合主キーを持つディクショナリテーブルを作成し、シミュレートされたデータをロードします。 |
| 181 | + |
| 182 | + ```SQL |
| 183 | + MySQL [test]> CREATE TABLE dict2 ( |
| 184 | + order_uuid STRING, |
| 185 | + order_date DATE, |
| 186 | + order_id_int BIGINT AUTO_INCREMENT |
| 187 | + ) |
| 188 | + PRIMARY KEY (order_uuid,order_date) -- composite primary Key |
| 189 | + DISTRIBUTED BY HASH (order_uuid,order_date) |
| 190 | + ; |
| 191 | + Query OK, 0 rows affected (0.02 sec) |
| 192 | + |
| 193 | + MySQL [test]> INSERT INTO dict2 VALUES ('a1','2023-11-22',default), ('a2','2023-11-22',default), ('a3','2023-11-22',default); |
| 194 | + Query OK, 3 rows affected (0.12 sec) |
| 195 | + {'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'} |
| 196 | + |
| 197 | + |
| 198 | + MySQL [test]> select * from dict2; |
| 199 | + +------------+------------+--------------+ |
| 200 | + | order_uuid | order_date | order_id_int | |
| 201 | + +------------+------------+--------------+ |
| 202 | + | a1 | 2023-11-22 | 1 | |
| 203 | + | a3 | 2023-11-22 | 3 | |
| 204 | + | a2 | 2023-11-22 | 2 | |
| 205 | + +------------+------------+--------------+ |
| 206 | + 3 rows in set (0.01 sec) |
| 207 | + ``` |
| 208 | + |
| 209 | +2. ディクショナリテーブル内のキーにマッピングされた値をクエリします。ディクショナリテーブルには複合主キーがあるため、すべての主キーを`dict_mapping`で指定する必要があります。 |
| 210 | + |
| 211 | + ```SQL |
| 212 | + SELECT dict_mapping('dict2', 'a1', cast('2023-11-22' as DATE)); |
| 213 | + ``` |
| 214 | + |
| 215 | + 主キーが1つだけ指定されている場合、エラーが発生することに注意してください。 |
| 216 | + |
| 217 | + ```SQL |
| 218 | + MySQL [test]> SELECT dict_mapping('dict2', 'a1'); |
| 219 | + ERROR 1064 (HY000): Getting analyzing error. Detail message: dict_mapping function param size should be 3 - 5. |
| 220 | + ``` |
0 commit comments