メインコンテンツまでスキップ

データのインポート(SDK)

このガイドでは、当社の SDK を使用し、bulk-writer API と bulk-import API でコレクションにデータをインポートする方法について説明します。

または、データの準備と Zilliz Cloud のコレクションへのデータのインポートの両方を扱う当社の高速なエンドツーエンドコースも参照できます。

Notes

Zilliz Cloud では現在、クラスターをホストするクラウドプロバイダーに関係なく、任意のオブジェクトストレージサービスから任意の Zilliz Cloud クラスターにデータをインポートできます。たとえば、AWS S3 バケットから GCP にデプロイされた Zilliz Cloud クラスターにデータをインポートできます。

低レイテンシで安定したエクスペリエンスを確保するには、ターゲットクラスターと同じプロバイダーおよび同じリージョンのバケットまたは blob コンテナーを使用することをお勧めします。

依存関係をインストールする​

ターミナルで次のコマンドを実行し、pymilvus と minio をインストールするか、最新バージョンにアップグレードします。

shell
python3 -m pip install --upgrade pymilvus minio

準備済みデータを確認する​

BulkWriter ツールを使用してデータを準備し、準備済みファイルのパスを取得したら、そのファイルを Zilliz Cloud コレクションにインポートする準備が整います。準備ができているかどうかを確認するには、次のようにします:

python
from minio import Minio
from pymilvus import MilvusClient, DataType
from pymilvus.bulk_writer import bulk_import
import json
from pymilvus.bulk_writer import get_import_progress
from pymilvus.bulk_writer import list_import_jobs

# Third-party constants
ACCESS_KEY = "YOUR_ACCESS_KEY"
SECRET_KEY = "YOUR_SECRET_KEY"
BUCKET_NAME = "YOUR_BUCKET_NAME"
REMOTE_PATH = "YOUR_REMOTE_PATH"

client = Minio(
endpoint="storage.googleapis.com", # use 's3.amazonaws.com' for AWS S3
access_key=ACCESS_KEY,
secret_key=SECRET_KEY,
secure=True
)

objects = client.list_objects(
bucket_name=BUCKET_NAME,
prefix=REMOTE_PATH,
recursive=True
)

print([obj.object_name for obj in objects])

# Output
#
# [
# "folder/1/claps.npy",
# "folder/1/id.npy",
# "folder/1/link.npy",
# "folder/1/publication.npy",
# "folder/1/reading_time.npy",
# "folder/1/responses.npy",
# "folder/1/title.npy",
# "folder/1/vector.npy"
# ]

ソースファイル内の StructArray フィールド​

StructArray フィールドは、ソースファイルのフォーマットごとに異なる形式で保持されます。インポートリーダーは、次のいずれかの形式を想定しています:

フォーマットStructArray フィールドの形式
JSON、JSONLフィールド値はオブジェクトのリストであり、Struct 要素ごとに 1 つのオブジェクトを持ち、サブフィールド名をキーとします:"chunks": [{"text": "...", "section": "index", "emb": [0.1, 0.2]}, ...]。
CSVセルには、JSON フォーマットと同じ JSON テキストが格納されます。インポートジョブに設定された nullkey または JSON の null は、null である StructArray 値を示します。
ParquetStructArray フィールドごとに、型が list<struct<...>> の列が 1 つあり、サブフィールドごとに 1 つの struct の子があります。スカラーのサブフィールドはスカラーの子、ベクトルのサブフィールドは list<float32> などの要素型のリストであり、配列のサブフィールドは list<T> の子です。
NumPyサポートされていません。NumPy ファイルでは、トップレベルのフィールドごとに 1 ファイルが使用され、StructArray フィールドを表す方法はありません。StructArray フィールドを含むコレクションには、JSON、CSV、または Parquet ファイルを使用してください。

次のルールは、サポートされているすべてのフォーマットの StructArray 値に適用されます:

  • 各 Struct 要素の内部では、chunks[text] のようなパスではなく、サブフィールド名を使用してください。chunks[text] という名前のフラットな列またはキーは拒否されます。

  • [null, {...}] のように、Struct 要素自体を null にすることはできません。StructArray 値全体が null になるのは、StructArray フィールドが null を許容する場合だけです。

  • コレクションのサブフィールドではないキーまたは Parquet の子(削除されたサブフィールドを含む)は無視されます。

  • 要素が null を許容するサブフィールドでキーが見つからない場合、またはその値が null の場合、該当する Struct 要素の null 値としてインポートされるため、サブフィールドを追加する前に作成されたファイルも、そのサブフィールドなしでインポートできます。それ以外の場所に null がある場合はインポートに失敗します。配列のサブフィールドでは、null は null の内部配列を表し、内部配列内の null は、サブフィールドがそれを許容する場合、null の内部値を表します。

  • バックアップからの復元などの binlog インポートと、スナップショットソースからのインポートは、要素が null を許容するサブフィールドまたはスカラー配列のサブフィールドを持つコレクションでは拒否されます。

pymilvus BulkWriter は、要素が null を許容するサブフィールドと null を許容する StructArray 値を含め、サポートされているすべてのフォーマットで上記の StructArray 形式をサポートしています。ライターの add_row() 呼び出しでは、同じ行形式を使用してください。

スキーマ側の制限については、StructArray Limits を参照してください。

データをインポートする​

データとコレクションの準備ができたら、オブジェクトストレージバケットやブロックストレージの blob コンテナーなどの外部ストレージを介して、データを特定のコレクションにインポートできます。

データをインポートする​

外部ストレージを介してデータをインポートする場合は、次のようにします:

python
# Bulk-import your data from the prepared data files
CLOUD_API_ENDPOINT = "https://api.cloud.zilliz.com"
CLUSTER_ID = "inxx-xxxxxxxxxxxxxxx"
API_KEY = ""
STORAGE_URL = ""
ACCESS_KEY = ""
SECRET_KEY = ""

res = bulk_import(
api_key=API_KEY,
url=CLOUD_API_ENDPOINT,
cluster_id=CLUSTER_ID,
collection_name="medium_articles",
object_url=STORAGE_URL,
access_key=ACCESS_KEY,
secret_key=SECRET_KEY
)

print(res.json())

# Output
#
# {
# "code": 0,
# "data": {
# "jobId": "9d0bc230-6b99-4739-a872-0b91cfe2515a"
# }
# }
Notes

データのインポートを成功させるには、ターゲットコレクションの実行中または保留中のインポートジョブが 10,000 件未満であることを確認してください。

インポートの進行状況を確認する​

指定した bulk-import ジョブの進行状況を確認できます。

python
## Zilliz Cloud constants
CLOUD_API_ENDPOINT = "https://api.cloud.zilliz.com"
CLUSTER_ID = "inxx-xxxxxxxxxxxxxxx"
API_KEY = ""

# Get bulk-insert job progress
resp = get_import_progress(
api_key=API_KEY,
url=CLOUD_API_ENDPOINT,
cluster_id=CLUSTER_ID,
job_id="job-01fa0e5d42cjxudhpuehyp",
)

print(json.dumps(resp.json(), indent=4))

すべてのインポートジョブを一覧表示する​

すべての bulk-import タスクについても確認する場合は、次のように list-import-jobs API を呼び出します:

python
## Zilliz Cloud constants
CLOUD_API_ENDPOINT = "https://api.cloud.zilliz.com"
CLUSTER_ID = "inxx-xxxxxxxxxxxxxxx"
API_KEY = ""

# List bulk-insert jobs
resp = list_import_jobs(
api_key=API_KEY,
url=CLOUD_API_ENDPOINT,
cluster_id=CLUSTER_ID
)

print(json.dumps(resp.json(), indent=4))