استيراد البيانات
توضح هذه الصفحة إجراء استيراد البيانات المعدة.
قبل أن تبدأ
أن تكون قد أعددت بياناتك بالفعل ووضعتها في دلو ملفوس.
إذا لم يكن الأمر كذلك، يجب عليك استخدام RemoteBulkWriter لإعداد بياناتك أولاً، والتأكد من أن البيانات المعدة قد تم نقلها بالفعل إلى دلو Milvus على مثيل MinIO الذي تم تشغيله مع مثيل Milvus الخاص بك. للحصول على التفاصيل، راجع إعداد بيانات المصدر.
لقد قمت بالفعل بإنشاء مجموعة مع المخطط الذي تستخدمه لإعداد بياناتك. إذا لم يكن كذلك، راجع إدارة المجموعات.
يقوم مقتطف التعليمات البرمجية التالي بإنشاء مجموعة بسيطة بالمخطط المحدد. لمزيد من المعلومات حول المعلمات، راجع create_schema()
و create_collection()
في مرجع SDK.
ينشئ مقتطف الشيفرة التالي مجموعة بسيطة بالمخطط المحدد. للمزيد من المعلومات حول المعلمات، ارجع إلى createCollection()
في مرجع SDK.
استيراد البيانات
لاستيراد البيانات المعدة، عليك إنشاء مهمة استيراد على النحو التالي:
from pymilvus.bulk_writer import bulk_import
url = f"http://127.0.0.1:19530"
# Bulk-insert data from a set of JSON files already uploaded to the MinIO server
resp = bulk_import(
url=url,
collection_name="quick_setup",
files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],
['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],
)
job_id = resp.json()['data']['jobId']
print(job_id)
private static String bulkImport(List<List<String>> batchFiles) throws InterruptedException {
MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()
.collectionName("quick_setup")
.files(batchFiles)
.build();
String bulkImportResult = BulkImport.bulkImport("http://localhost:19530", milvusImportRequest);
System.out.println(bulkImportResult);
JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);
String jobId = bulkImportObject.getAsJsonObject("data").get("jobId").getAsString();
System.out.println("Create a bulkInert task, job id: " + jobId);
return jobId;
}
public static void main(String[] args) throws Exception {
List<List<String>> batchFiles = uploadData();
String jobId = bulkImport(batchFiles);
}
export MILVUS_URI="localhost:19530"
curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/create" \
--header "Content-Type: application/json" \
--data-raw '{
"files": [
[
"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet"
],
[
"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet"
]
],
"collectionName": "quick_setup"
}'
يحتوي نص الطلب على حقلين:
collectionName
اسم المجموعة المستهدفة.
files
قائمة بقوائم مسارات الملفات بالنسبة للمسار الجذر لحافظة Milvus على مثيل MioIO الذي بدأ مع مثيل Milvus الخاص بك. القوائم الفرعية المحتملة هي كما يلي:
ملفات JSON
إذا كان الملف المُعد بتنسيق JSON، فيجب أن تحتوي كل قائمة فرعية على المسار إلى ملف JSON واحد مُعد.
[ "/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json" ],
ملفات الباركيه
إذا كان الملف المُعد بتنسيق Parquet، فيجب أن تحتوي كل قائمة فرعية على المسار إلى ملف باركيه واحد مُعد.
[ "/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet" ]
العائد المحتمل كما يلي:
{
"code": 200,
"data": {
"jobId": "448707763884413158"
}
}
تحقق من تقدم الاستيراد
بمجرد الحصول على معرف مهمة الاستيراد، يمكنك التحقق من تقدم الاستيراد على النحو التالي:
import json
from pymilvus.bulk_writer import get_import_progress
url = f"http://127.0.0.1:19530"
# Get bulk-insert job progress
resp = get_import_progress(
url=url,
job_id="453265736269038336",
)
print(json.dumps(resp.json(), indent=4))
private static void getImportProgress(String jobId) {
while (true) {
System.out.println("Wait 5 second to check bulkInsert job state...");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
break;
}
MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()
.jobId(jobId)
.build();
String getImportProgressResult = BulkImport.getImportProgress("http://localhost:19530", request);
JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);
String state = getImportProgressObject.getAsJsonObject("data").get("state").getAsString();
String progress = getImportProgressObject.getAsJsonObject("data").get("progress").getAsString();
if ("Failed".equals(state)) {
String reason = getImportProgressObject.getAsJsonObject("data").get("reason").getAsString();
System.out.printf("The job %s failed, reason: %s%n", jobId, reason);
break;
} else if ("Completed".equals(state)) {
System.out.printf("The job %s completed%n", jobId);
break;
} else {
System.out.printf("The job %s is running, state:%s progress:%s%n", jobId, state, progress);
}
}
}
public static void main(String[] args) throws Exception {
List<List<String>> batchFiles = uploadData();
String jobId = bulkImport(batchFiles);
getImportProgress(jobId);
}
export MILVUS_URI="localhost:19530"
curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/describe" \
--header "Content-Type: application/json" \
--data-raw '{
"jobId": "449839014328146739"
}'
يكون الرد المحتمل كما يلي:
{
"code": 200,
"data": {
"collectionName": "quick_setup",
"completeTime": "2024-05-18T02:57:13Z",
"details": [
{
"completeTime": "2024-05-18T02:57:11Z",
"fileName": "id:449839014328146740 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\" ",
"fileSize": 31567874,
"importedRows": 100000,
"progress": 100,
"state": "Completed",
"totalRows": 100000
},
{
"completeTime": "2024-05-18T02:57:11Z",
"fileName": "id:449839014328146741 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\" ",
"fileSize": 31517224,
"importedRows": 100000,
"progress": 100,
"state": "Completed",
"totalRows": 200000
}
],
"fileSize": 63085098,
"importedRows": 200000,
"jobId": "449839014328146739",
"progress": 100,
"state": "Completed",
"totalRows": 200000
}
}
سرد مهام الاستيراد
يمكنك سرد جميع مهام الاستيراد المتعلقة بمجموعة محددة على النحو التالي:
import json
from pymilvus.bulk_writer import list_import_jobs
url = f"http://127.0.0.1:19530"
# List bulk-insert jobs
resp = list_import_jobs(
url=url,
collection_name="quick_setup",
)
print(json.dumps(resp.json(), indent=4))
private static void listImportJobs() {
MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName("quick_setup").build();
String listImportJobsResult = BulkImport.listImportJobs("http://localhost:19530", listImportJobsRequest);
System.out.println(listImportJobsResult);
}
public static void main(String[] args) throws Exception {
listImportJobs();
}
export MILVUS_URI="localhost:19530"
curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/list" \
--header "Content-Type: application/json" \
--data-raw '{
"collectionName": "quick_setup"
}'
القيم الممكنة هي كالتالي:
{
"code": 200,
"data": {
"records": [
{
"collectionName": "quick_setup",
"jobId": "448761313698322011",
"progress": 50,
"state": "Importing"
}
]
}
}
القيود
يجب ألا يتجاوز حجم كل ملف استيراد 16 جيجابايت.
يجب ألا يتجاوز الحد الأقصى لعدد طلبات الاستيراد 1024.
يجب ألا يتجاوز الحد الأقصى لعدد الملفات لكل طلب استيراد 1024.
يمكن تحديد اسم قسم واحد فقط في طلب الاستيراد. إذا لم يتم تحديد اسم قسم، سيتم إدراج البيانات في القسم الافتراضي. بالإضافة إلى ذلك، لا يمكنك تعيين اسم قسم في طلب الاستيراد إذا قمت بتعيين مفتاح القسم في المجموعة المستهدفة.
القيود
قبل استيراد البيانات، تأكد من أنك قد تعرفت على القيود فيما يتعلق بسلوكيات ميلفوس التالية:
القيود المتعلقة بسلوك التحميل:
- إذا تم تحميل مجموعة بالفعل قبل الاستيراد، يمكنك استخدام الدالة
refresh_load
لتحميل البيانات المستوردة حديثًا بعد اكتمال الاستيراد.
- إذا تم تحميل مجموعة بالفعل قبل الاستيراد، يمكنك استخدام الدالة
القيود المتعلقة بسلوكيات الاستعلام والبحث:
قبل اكتمال حالة مهمة الاستيراد، يتم ضمان أن تكون البيانات المستوردة حديثًا غير مرئية للاستعلامات وعمليات البحث.
بمجرد اكتمال حالة المهمة,
إذا لم يتم تحميل المجموعة، يمكنك استخدام الدالة
load
لتحميل البيانات المستوردة حديثًا.إذا كانت المجموعة محملة بالفعل، يمكنك استدعاء
load(is_refresh=True)
لتحميل البيانات المستوردة.
القيود المتعلقة بسلوك الحذف:
قبل اكتمال حالة مهمة الاستيراد، الحذف غير مضمون وقد ينجح أو لا ينجح.
الحذف بعد اكتمال حالة المهمة مضمون النجاح.
التوصيات
نوصي بشدة باستخدام ميزة الاستيراد متعدد الملفات، والتي تسمح لك بتحميل عدة ملفات في طلب واحد. لا تعمل هذه الطريقة على تبسيط عملية الاستيراد فحسب، بل تعزز أداء الاستيراد بشكل كبير. وفي الوقت نفسه، من خلال دمج عمليات التحميل الخاصة بك، يمكنك تقليل الوقت المستغرق في إدارة البيانات وجعل سير عملك أكثر كفاءة.