ストレージ接続インデックス (SAI) の使用
SAIインデックスの作成
SAIインデックスを作成するには、インデックス名、テーブル名、およびインデックスを作成する列の列名を定義する必要があります。
単純なSAIインデックスを作成するには
CREATE INDEX lastname_sai_idx ON cycling.cyclist_semi_pro (lastname)
USING 'sai'
WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'};
CREATE INDEX age_sai_idx ON cycling.cyclist_semi_pro (age)
USING 'sai';
CREATE INDEX country_sai_idx ON cycling.cyclist_semi_pro (country)
USING 'sai'
WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'};
CREATE INDEX registration_sai_idx ON cycling.cyclist_semi_pro (registration)
USING 'sai';
ほとんどのSAIインデックスでは、列名は、USING 'sai'
も使用するCREATE INDEX
ステートメントで定義されます。SAIインデックスオプションは、WITH OPTIONS
句で定義されます。case_sensitive
オプションは、大文字と小文字を区別しない検索を許可するためにfalse
に設定されています。normalize
オプションは、Unicode文字の正規化された検索を許可するためにtrue
に設定されています。ascii_only
オプションは、ASCII文字に制限された検索を許可するためにtrue
に設定されています。
map
コレクションデータ型は、以下の例に示すように、1つの例外です。
パーティションキーのSAIエラー
SAIインデックスは、プライマリインデックスがすでに存在し、クエリに使用されているため、パーティションキーに作成することはできません。パーティションキー列にSAIを作成しようとすると、エラーが返されます
SAIインデックス内のmap
コレクション
マップコレクションは、他のSAIインデックスとは異なる形式を持っています
// Create an index on a map key to find all cyclist/team combos for a year
// tag::keysidx[]
CREATE INDEX IF NOT EXISTS team_year_keys_idx
ON cycling.cyclist_teams ( KEYS (teams) );
// end::keysidx[]
// Create an index on a map key to find all cyclist/team combos for a year
// tag::valuesidx[]
CREATE INDEX IF NOT EXISTS team_year_values_idx
ON cycling.cyclist_teams ( VALUES (teams) );
// end::valuesidx[]
// Create an index on a map key to find all cyclist/team combos for a year
// tag::entriesidx[]
CREATE INDEX IF NOT EXISTS team_year_entries_idx
ON cycling.cyclist_teams ( ENTRIES (teams) );
// end::entriesidx[]
ベクトル検索の類似度関数
この例では、次のテーブルを使用します
CREATE TABLE IF NOT EXISTS cycling.comments_vs (
record_id timeuuid,
id uuid,
commenter text,
comment text,
comment_vector VECTOR <FLOAT, 5>,
created_at timestamp,
PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
comment_vector
に特定の類似度関数が設定されているかどうかを確認するには、similarity-function
オプションを、サポートされている類似度関数(DOT_PRODUCT、COSINE、またはEUCLIDEAN)のいずれかに設定します。デフォルトの類似度関数はCOSINEです。
このインデックスは、類似度関数がDOT_PRODUCTに設定されたcomment_vector
列にインデックスを作成します
CREATE INDEX sim_comments_idx
ON cycling.comments_vs (comment_vector)
USING 'sai'
WITH OPTIONS = { 'similarity_function': 'DOT_PRODUCT'};
その他のリソース
SAIインデックスの作成の詳細については、CREATE CUSTOM INDEXを参照してください。
SAIインデックスの変更
SAIインデックスは変更できません。SAIインデックスを変更する必要がある場合は、現在のインデックスを削除し、新しいインデックスを作成して、サイクリングを再構築する必要があります。
-
インデックスの削除
DROP INDEX IF EXISTS cycling.lastname_sai_idx;
-
新しいインデックスの作成
CREATE INDEX lastname_sai_idx ON cycling.cyclist_semi_pro (lastname) USING 'sai' WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'}; CREATE INDEX age_sai_idx ON cycling.cyclist_semi_pro (age) USING 'sai'; CREATE INDEX country_sai_idx ON cycling.cyclist_semi_pro (country) USING 'sai' WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'}; CREATE INDEX registration_sai_idx ON cycling.cyclist_semi_pro (registration) USING 'sai';
SAIインデックスの削除
SAIインデックスは削除(削除)できます。
SAIインデックスを削除するには
DROP INDEX IF EXISTS cycling.lastname_sai_idx;
このコマンドは結果を返しません。
SAIを使用したクエリ
SAIクイックスタートは、非プライマリキー列に基づいて複数のインデックスを定義すること(非常に便利な機能)のみに焦点を当てています。さまざまな定義のSAIインデックスを持つテーブルでクエリを実行する方法の例を使用して、他のオプションを調べてみましょう。
SAIは |
ベクトル検索
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.comments_vs (
record_id timeuuid,
id uuid,
commenter text,
comment text,
comment_vector VECTOR <FLOAT, 5>,
created_at timestamp,
PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX IF NOT EXISTS ann_index
ON cycling.comments_vs(comment_vector) USING 'sai';
CQLでベクトルデータをクエリする
ベクトル検索を使用してデータをクエリするには、SELECT
クエリを使用します
SELECT * FROM cycling.comments_vs
ORDER BY comment_vector ANN OF [0.15, 0.1, 0.1, 0.35, 0.55]
LIMIT 3;
id | created_at | comment | comment_vector | commenter | record_id
--------------------------------------+---------------------------------+----------------------------------------+------------------------------+-----------+--------------------------------------
e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-04-01 14:33:02.160000+0000 | LATE RIDERS SHOULD NOT DELAY THE START | [0.9, 0.54, 0.12, 0.1, 0.95] | Alex | 616e77e0-22a2-11ee-b99d-1f350647414a
c7fceba0-c141-4207-9494-a29f9809de6f | 2017-02-17 08:43:20.234000+0000 | Glad you ran the race in the rain | [0.3, 0.34, 0.2, 0.78, 0.25] | Amy | 6170c1d0-22a2-11ee-b99d-1f350647414a
c7fceba0-c141-4207-9494-a29f9809de6f | 2017-04-01 13:43:08.030000+0000 | Last climb was a killer | [0.3, 0.75, 0.2, 0.2, 0.5] | Amy | 62105d30-22a2-11ee-b99d-1f350647414a
制限は1,000以下でなければなりません。 |
結果を右にスクロールすると、クエリに使用された埋め込みに最もよく一致するテーブルのコメントが表示されます。
列の単一インデックスの一致
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.comments_vs (
record_id timeuuid,
id uuid,
commenter text,
comment text,
comment_vector VECTOR <FLOAT, 5>,
created_at timestamp,
PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
ON cycling.comments_vs (commenter)
USING 'sai';
CREATE INDEX created_at_idx
ON cycling.comments_vs (created_at)
USING 'sai';
CREATE INDEX ann_index
ON cycling.comments_vs (comment_vector)
USING 'sai';
列commenter
はこのテーブルのパーティションキーではないため、クエリするにはインデックスが必要です。
その列の一致をクエリします
SELECT * FROM cycling.comments_vs
WHERE commenter = 'Alex';
id | created_at | comment | comment_vector | commenter | record_id
--------------------------------------+---------------------------------+----------------------------------------+------------------------------+-----------+--------------------------------------
e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-04-01 14:33:02.160000+0000 | LATE RIDERS SHOULD NOT DELAY THE START | [0.9, 0.54, 0.12, 0.1, 0.95] | Alex | 6d0cdaa0-272b-11ee-859f-b9098002fcac
e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 | Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] | Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac
オプション付きの列の単一インデックス一致
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.comments_vs (
record_id timeuuid,
id uuid,
commenter text,
comment text,
comment_vector VECTOR <FLOAT, 5>,
created_at timestamp,
PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_cs_idx ON cycling.comments_vs (commenter)
USING 'sai'
WITH OPTIONS = {'case_sensitive': 'true', 'normalize': 'true', 'ascii': 'true'};
大文字と小文字の区別
列commenter
はこのテーブルのパーティションキーではないため、クエリするにはインデックスが必要です。commenter
を大文字と小文字を区別する値としてチェックする場合は、case_sensitive
オプションをtrue
に設定できます。
クエリで不適切に大文字と小文字を区別する値を使用した場合、結果は返されないことに注意してください
SELECT * FROM comments_vs WHERE commenter ='alex';
id | created_at | comment | comment_vector | commenter | record_id
----+------------+---------+----------------+-----------+-----------
(0 rows)
サイクリストの名前の大文字と小文字をインデックスの大文字と小文字と一致するように切り替えると、クエリは成功します
複合パーティションキー列のインデックス一致
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.rank_by_year_and_name (
race_year int,
race_name text,
cyclist_name text,
rank int,
PRIMARY KEY ((race_year, race_name), rank)
);
CREATE INDEX race_name_idx
ON cycling.rank_by_year_and_name (race_name)
USING 'sai';
CREATE INDEX race_year_idx
ON cycling.rank_by_year_and_name (race_year)
USING 'sai';
複合パーティションキーは、テーブル内の複数の列によって定義されたパーティションを持ちます。通常、WHERE
句でテーブルをクエリするには、パーティションキー内のすべての列を指定する必要があります。ただし、SAIインデックスを使用すると、テーブルの複合パーティションキー内の単一の列を使用してインデックスを定義できます。1つの列に基づいてクエリを実行する必要がある場合は、複合パーティションキーの各列にSAIインデックスを作成できます。
SAIインデックスを使用すると、非効率的なALLOW FILTERING
ディレクティブを使用せずにテーブルをクエリすることもできます。ALLOW FILTERING
ディレクティブでは、テーブル内のすべてのパーティションをスキャンする必要があるため、パフォーマンスが低下します。
race_year
列とrace_name
列は、cycling.rank_by_year_and_name
テーブルの複合パーティションキーを構成します。
列race_name
の一致をクエリします
SELECT * FROM cycling.rank_by_year_and_name
WHERE race_name = 'Tour of Japan - Stage 4 - Minami > Shinshu';
race_year | race_name | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Benjamin PRADES
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Thomas LEBAS
列race_year
の一致をクエリします
SELECT * FROM cycling.rank_by_year_and_name
WHERE race_year = 2014;
race_year | race_name | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT
2014 | 4th Tour of Beijing | 2 | Daniel MARTIN
2014 | 4th Tour of Beijing | 3 | Johan Esteban CHAVES
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Benjamin PRADES
ANDで一致する複数のインデックス
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.comments_vs (
record_id timeuuid,
id uuid,
commenter text,
comment text,
comment_vector VECTOR <FLOAT, 5>,
created_at timestamp,
PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
ON cycling.comments_vs (commenter)
USING 'sai';
CREATE INDEX created_at_idx
ON cycling.comments_vs (created_at)
USING 'sai';
CREATE INDEX ann_index
ON cycling.comments_vs (comment_vector)
USING 'sai';
複数の列の一致をクエリする方法を示すために、テーブルにいくつかのインデックスが作成されます。
複数の列の一致をクエリし、両方の列が一致する必要があります
SELECT * FROM cycling.comments_vs
WHERE
created_at='2017-03-21 21:11:09.999000+0000'
AND commenter = 'Alex';
id | created_at | comment | comment_vector | commenter | record_id
--------------------------------------+---------------------------------+-----------------------------------+------------------------------+-----------+--------------------------------------
e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 | Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] | Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac
ORで一致する複数のインデックス
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.comments_vs (
record_id timeuuid,
id uuid,
commenter text,
comment text,
comment_vector VECTOR <FLOAT, 5>,
created_at timestamp,
PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
ON cycling.comments_vs (commenter)
USING 'sai';
CREATE INDEX created_at_idx
ON cycling.comments_vs (created_at)
USING 'sai';
CREATE INDEX ann_index
ON cycling.comments_vs (comment_vector)
USING 'sai';
複数の列の一致をクエリする方法を示すために、テーブルにいくつかのインデックスが作成されます。
1つの列または他の列の一致をクエリします
SELECT * FROM cycling.comments_vs
WHERE
created_at='2017-03-21 21:11:09.999000+0000'
OR created_at='2017-03-22 01:16:59.001000+0000';
id | created_at | comment | comment_vector | commenter | record_id
--------------------------------------+---------------------------------+-----------------------------------+------------------------------+-----------+--------------------------------------
e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 | Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] | Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac
c7fceba0-c141-4207-9494-a29f9809de6f | 2017-03-22 01:16:59.001000+0000 | Great snacks at all reststops | [0.1, 0.4, 0.1, 0.52, 0.09] | Amy | 6d0fc0d0-272b-11ee-859f-b9098002fcac
INで一致する複数のインデックス
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.comments_vs (
record_id timeuuid,
id uuid,
commenter text,
comment text,
comment_vector VECTOR <FLOAT, 5>,
created_at timestamp,
PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
ON cycling.comments_vs (commenter)
USING 'sai';
CREATE INDEX created_at_idx
ON cycling.comments_vs (created_at)
USING 'sai';
CREATE INDEX ann_index
ON cycling.comments_vs (comment_vector)
USING 'sai';
複数の列の一致をクエリする方法を示すために、テーブルにいくつかのインデックスが作成されます。
値のリスト内の列値と一致するクエリ
SELECT * FROM cycling.comments_vs
WHERE created_at IN
('2017-03-21 21:11:09.999000+0000'
,'2017-03-22 01:16:59.001000+0000');
id | created_at | comment | comment_vector | commenter | record_id
--------------------------------------+---------------------------------+-----------------------------------+------------------------------+-----------+--------------------------------------
e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 | Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] | Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac
c7fceba0-c141-4207-9494-a29f9809de6f | 2017-03-22 01:16:59.001000+0000 | Great snacks at all reststops | [0.1, 0.4, 0.1, 0.52, 0.09] | Amy | 6d0fc0d0-272b-11ee-859f-b9098002fcac
ユーザー定義型
SAIは、ユーザー定義型(UDT)またはUDTのリストのいずれかをインデックス化できます。この例では、UDTのリストをインデックス化する方法を示します。
この例では、次のユーザー定義型(UDT)、テーブル、およびインデックスを使用します
CREATE TYPE IF NOT EXISTS cycling.race (
race_title text,
race_date timestamp,
race_time text
);
CREATE TABLE IF NOT EXISTS cycling.cyclist_races (
id UUID PRIMARY KEY,
lastname text,
firstname text,
races list<FROZEN <race>>
);
CREATE INDEX races_idx
ON cycling.cyclist_races (races)
USING 'sai';
cycling.cyclist_races
テーブルのUDTリスト型カラムraces
にインデックスが作成されます。
リスト型カラムraces
に対してCONTAINS
を使用したクエリ
SELECT * FROM cycling.cyclist_races
WHERE races CONTAINS {
race_title:'Rabobank 7-Dorpenomloop Aalburg',
race_date:'2015-05-09',
race_time:'02:58:33'};
id | firstname | lastname | races
--------------------------------------+-----------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | Marianne | VOS | [{race_title: 'Rabobank 7-Dorpenomloop Aalburg', race_date: '2015-05-09 00:00:00.000000+0000', race_time: '02:58:33'}, {race_title: 'Ronde van Gelderland', race_date: '2015-04-19 00:00:00.000000+0000', race_time: '03:22:23'}]
(1 rows)
コレクションを使用したSAIインデックス
SAIはmap
、list
、set
型のコレクションをサポートします。コレクションを使用すると、データをグループ化してカラムに一緒に保存できます。
リレーショナルデータベースでは、ユーザーの複数のメールアドレスなどのグループ化は、(たとえば)user
テーブルとemail
テーブル間の多対一の結合関係を介して実現されます。Apache Cassandraは、user
テーブルのコレクションカラムにユーザーのメールアドレスを格納することにより、2つのテーブル間の結合を回避します。各コレクションは、保持されるデータのデータ型を指定します。
コレクションは、コレクションストレージのデータが制限されている場合に適しています。メッセージ送信や毎秒登録されるセンサーイベントのように、データの成長が無限である可能性がある場合は、コレクションを使用しないでください。代わりに、クラスタリングカラムにデータが格納される複合プライマリキーを持つテーブルを使用してください。
SAIインデックスを持つデータベーステーブルのCQLクエリでは、
|
set型を使用する
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.cyclist_career_teams (
id UUID PRIMARY KEY,
lastname text,
teams set<text>
);
CREATE INDEX teams_idx
ON cycling.cyclist_career_teams (teams)
USING 'sai';
cyclist_career_teams
テーブルのset型カラムteams
にインデックスが作成されます。
set型カラムteams
に対してCONTAINS
を使用したクエリ
SELECT * FROM cycling.cyclist_career_teams
WHERE teams CONTAINS 'Rabobank-Liv Giant';
id | lastname | teams
--------------------------------------+----------+------------------------------------------------------------------------------------------------------
5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | VOS | {'Nederland bloeit', 'Rabobank Women Team', 'Rabobank-Liv Giant', 'Rabobank-Liv Woman Cycling Team'}
list型を使用する
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.upcoming_calendar (
year int,
month int,
events list<text>,
PRIMARY KEY (year, month)
);
CREATE INDEX events_idx
ON cycling.upcoming_calendar (events)
USING 'sai';
upcoming_calendar
テーブルのlist型カラムevents
にインデックスが作成されます。
list型カラムevents
に対してCONTAINS
を使用したクエリ
SELECT * FROM cycling.upcoming_calendar
WHERE events CONTAINS 'Criterium du Dauphine';
year | month | events
------+-------+-----------------------------------------------
2015 | 6 | ['Criterium du Dauphine', 'Tour de Sui\nsse']
わずかに複雑なクエリでは、特定のイベントを含む行または特定の日付の月の行を選択します。
map型を使用する
この例では、次のテーブルとインデックスを使用します
CREATE TABLE IF NOT EXISTS cycling.cyclist_teams (
id uuid PRIMARY KEY,
firstname text,
lastname text,
teams map<int, text>
);
CREATE INDEX IF NOT EXISTS team_year_keys_idx
ON cycling.cyclist_teams ( KEYS (teams) );
CREATE INDEX IF NOT EXISTS team_year_entries_idx
ON cycling.cyclist_teams ( ENTRIES (teams) );
CREATE INDEX IF NOT EXISTS team_year_values_idx
ON cycling.cyclist_teams ( VALUES (teams) );
cyclist_career_teams
テーブルのmap型カラムteams
に作成されたインデックスは、カラムデータのキー、値、および完全なエントリを対象とします。
map型カラムteams
からKEYS
を使用したクエリ
SELECT * FROM cyclist_teams WHERE teams CONTAINS KEY 2014;
id | firstname | lastname | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | Marianne | VOS | {2014: 'Rabobank-Liv Woman Cycling Team', 2015: 'Rabobank-Liv Woman Cycling Team'}
CONTAINS
キーワードのみが含まれていることに注意して、map型カラムteams
から値をクエリします。
SELECT * FROM cyclist_teams WHERE teams CONTAINS 'Team Garmin - Cervelo';
id | firstname | lastname | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
WHERE
句の違いに注意して、map型カラムteams
からエントリをクエリします。
SELECT * FROM cyclist_teams
WHERE
teams[2014] = 'Boels:Dolmans Cycling Team'
AND teams[2015] = 'Boels:Dolmans Cycling Team';
id | firstname | lastname | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
この例では、map型カラムteams
に2つのエントリが存在する行を探します。
詳細については、以下を参照してください。