Skip to content

Commit ca56787

Browse files
author
docs-automation[bot]
committed
docs: automated translation via Gemini
1 parent cee00ad commit ca56787

1 file changed

Lines changed: 220 additions & 0 deletions

File tree

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
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

Comments
 (0)