مشاركة عبر


كيفية استيعاب البيانات باستخدام pg_azure_storage في Azure Cosmos DB ل PostgreSQL

هام

لم يعد Azure Cosmos DB ل PostgreSQL مدعوما للمشاريع الجديدة. لا تستخدم هذه الخدمة لمشاريع جديدة. بدلا من ذلك، استخدم إحدى هاتين الخدمتين:

توضح هذه المقالة كيفية استخدام ملحق postgreSQL pg_azure_storage لمعالجة البيانات وتحميلها في Azure Cosmos DB ل PostgreSQL مباشرة من Azure Blob Storage (ABS). ABS هي خدمة تخزين قابلة للتطوير ودائمة وآمنة في السحابة. تجعل هذه الخصائص خيارا جيدا لتخزين البيانات الموجودة ونقلها إلى السحابة.

إعداد قاعدة البيانات وتخزين الكائنات الثنائية كبيرة الحجم

لتحميل البيانات من Azure Blob Storage، قم بتثبيت pg_azure_storage ملحق PostgreSQL في قاعدة البيانات الخاصة بك:

SELECT * FROM create_extension('azure_storage');

هام

يتوفر ملحق pg_azure_storage فقط على Azure Cosmos DB لمجموعات PostgreSQL التي تشغل PostgreSQL 13 وما فوق.

لقد أعددنا مجموعة بيانات العرض التوضيحي العام لهذه المقالة. لاستخدام مجموعة البيانات الخاصة بك، اتبع ترحيل البيانات المحلية إلى التخزين السحابي لمعرفة كيفية الحصول على مجموعات البيانات بكفاءة إلى Azure Blob Storage.

إشعار

سيسمح لك تحديد "الحاوية (الوصول للقراءة المجهولة للحاويات والكائنات الثنائية كبيرة الحجم)" باستيعاب الملفات من Azure Blob Storage باستخدام عناوين URL العامة الخاصة بها وتعداد محتويات الحاوية دون الحاجة إلى تكوين مفتاح حساب في pg_azure_storage. تتطلب الحاويات التي تم تعيينها على مستوى الوصول "خاص (لا وصول مجهول)" أو "Blob (الوصول للقراءة المجهولة للكائنات الثنائية كبيرة الحجم فقط)" مفتاح وصول.

قائمة محتويات الحاوية

هناك عرض توضيحي لحساب Azure Blob Storage وحاوية تم إنشاؤها مسبقا لهذه الكيفية. اسم الحاوية هو github، وهو في pgquickstart الحساب. يمكننا بسهولة معرفة الملفات الموجودة في الحاوية باستخدام الدالة azure_storage.blob_list(account, container) .

SELECT path, bytes, pg_size_pretty(bytes), content_type
  FROM azure_storage.blob_list('pgquickstart','github');
-[ RECORD 1 ]--+-------------------
path           | events.csv.gz
bytes          | 41691786
pg_size_pretty | 40 MB
content_type   | application/x-gzip
-[ RECORD 2 ]--+-------------------
path           | users.csv.gz
bytes          | 5382831
pg_size_pretty | 5257 kB
content_type   | application/x-gzip

يمكنك تصفية الإخراج إما باستخدام عبارة SQL WHERE عادية، أو باستخدام معلمة prefixblob_list UDF. يقوم الأخير بتصفية الصفوف التي تم إرجاعها على جانب Azure Blob Storage.

إشعار

يتطلب سرد محتويات الحاوية حسابا ومفتاح وصول أو حاوية مع تمكين الوصول المجهول.

SELECT * FROM azure_storage.blob_list('pgquickstart','github','e');
-[ RECORD 1 ]----+---------------------------------
path             | events.csv.gz
bytes            | 41691786
last_modified    | 2022-10-12 18:49:51+00
etag             | 0x8DAAC828B970928
content_type     | application/x-gzip
content_encoding |
content_hash     | 473b6ad25b7c88ff6e0a628889466aed
SELECT *
  FROM azure_storage.blob_list('pgquickstart','github')
 WHERE path LIKE 'e%';
-[ RECORD 1 ]----+---------------------------------
path             | events.csv.gz
bytes            | 41691786
last_modified    | 2022-10-12 18:49:51+00
etag             | 0x8DAAC828B970928
content_type     | application/x-gzip
content_encoding |
content_hash     | 473b6ad25b7c88ff6e0a628889466aed

تحميل البيانات من ABS

تحميل البيانات باستخدام الأمر COPY

ابدأ بإنشاء مخطط عينة.

CREATE TABLE github_users
(
	user_id bigint,
	url text,
	login text,
	avatar_url text,
	gravatar_id text,
	display_login text
);

CREATE TABLE github_events
(
	event_id bigint,
	event_type text,
	event_public boolean,
	repo_id bigint,
	payload jsonb,
	repo jsonb,
	user_id bigint,
	org jsonb,
	created_at timestamp
);

CREATE INDEX event_type_index ON github_events (event_type);
CREATE INDEX payload_index ON github_events USING GIN (payload jsonb_path_ops);

SELECT create_distributed_table('github_users', 'user_id');
SELECT create_distributed_table('github_events', 'user_id');

يصبح تحميل البيانات في الجداول بسيطا مثل استدعاء COPY الأمر .

-- download users and store in table

COPY github_users
FROM 'https://pgquickstart.blob.core.windows.net/github/users.csv.gz';

-- download events and store in table

COPY github_events
FROM 'https://pgquickstart.blob.core.windows.net/github/events.csv.gz';

لاحظ كيف أدرك الملحق أن عناوين URL المقدمة إلى أمر النسخ هي من Azure Blob Storage، والملفات التي أشرنا إليها تم ضغطها بواسطة gzip وتم أيضا التعامل معها تلقائيا بالنسبة لنا.

COPY يدعم الأمر المزيد من المعلمات والتنسيقات. في المثال أعلاه، تم تحديد التنسيق والضغط تلقائيا استنادا إلى ملحقات الملف. ومع ذلك، يمكنك توفير التنسيق بشكل مشابه مباشرة للأمر العادي COPY .

COPY github_users
FROM 'https://pgquickstart.blob.core.windows.net/github/users.csv.gz'
WITH (FORMAT 'csv');

يدعم الملحق حاليا تنسيقات الملفات التالية:

format الوصف
csv تنسيق القيم المفصولة بفواصل المستخدم بواسطة PostgreSQL COPY
tsv قيم مفصولة بعلامات جدولة، تنسيق PostgreSQL COPY الافتراضي
binary تنسيق Binary PostgreSQL COPY
النص ملف يحتوي على قيمة نصية واحدة (على سبيل المثال، JSON كبير أو XML)

تحميل البيانات باستخدام blob_get()

COPY الأمر مناسب، ولكنه محدود في المرونة. يستخدم COPY داخليا الدالة blob_get ، والتي يمكنك استخدامها مباشرة لمعالجة البيانات في سيناريوهات أكثر تعقيدا.

SELECT *
  FROM azure_storage.blob_get(
         'pgquickstart', 'github',
         'users.csv.gz', NULL::github_users
       )
 LIMIT 3;
-[ RECORD 1 ]-+--------------------------------------------
user_id       | 21
url           | https://api.github.com/users/technoweenie
login         | technoweenie
avatar_url    | https://avatars.githubusercontent.com/u/21?
gravatar_id   |
display_login | technoweenie
-[ RECORD 2 ]-+--------------------------------------------
user_id       | 22
url           | https://api.github.com/users/macournoyer
login         | macournoyer
avatar_url    | https://avatars.githubusercontent.com/u/22?
gravatar_id   |
display_login | macournoyer
-[ RECORD 3 ]-+--------------------------------------------
user_id       | 38
url           | https://api.github.com/users/atmos
login         | atmos
avatar_url    | https://avatars.githubusercontent.com/u/38?
gravatar_id   |
display_login | atmos

إشعار

في الاستعلام أعلاه، يتم إحضار الملف بالكامل قبل LIMIT 3 تطبيقه.

باستخدام هذه الدالة، يمكنك معالجة البيانات بسرعة في الاستعلامات المعقدة، والقيام بالاستيراد ك INSERT FROM SELECT.

INSERT INTO github_users
     SELECT user_id, url, UPPER(login), avatar_url, gravatar_id, display_login
       FROM azure_storage.blob_get('pgquickstart', 'github', 'users.csv.gz', NULL::github_users)
      WHERE gravatar_id IS NOT NULL;
INSERT 0 264308

في الأمر أعلاه، قمنا بتصفية البيانات إلى الحسابات ذات gravatar_id الحالة الحالية والعليا لتسجيلات الدخول الخاصة بهم بسرعة.

خيارات blob_get()

في بعض الحالات، قد تحتاج إلى التحكم بالضبط في ما blob_get تحاول القيام به باستخدام decoderالمعلمات و compressionoptions .

يمكن تعيين أداة فك التشفير إلى auto (افتراضي) أو أي من القيم التالية:

format الوصف
csv تنسيق القيم المفصولة بفواصل المستخدم بواسطة PostgreSQL COPY
tsv قيم مفصولة بعلامات جدولة، تنسيق PostgreSQL COPY الافتراضي
binary تنسيق Binary PostgreSQL COPY
النص ملف يحتوي على قيمة نصية واحدة (على سبيل المثال، JSON كبير أو XML)

compression يمكن أن يكون إما auto (افتراضي)، none أو gzip.

وأخيرا، المعلمة options من نوع jsonb. هناك أربع دالات مساعدة تساعد في بناء قيم لها. يتم تعيين كل دالة أداة مساعدة لأداة فك التشفير المطابقة لاسمها.

فك دالة الخيارات
csv options_csv_get
tsv options_tsv
binary options_binary
النص options_copy

من خلال النظر إلى تعريفات الدالة، يمكنك معرفة المعلمات التي يدعمها أداة فك التشفير.

options_csv_get - محدد، null_string، رأس، اقتباس، هروب، force_not_null، force_null، content_encoding options_tsv - محدد، null_string، content_encoding options_copy - محدد، null_string، رأس، اقتباس، إلغاء، force_quote، force_not_null، force_null، content_encoding. options_binary - content_encoding

معرفة ما سبق، يمكننا تجاهل التسجيلات التي تحتوي على قيمة خالية gravatar_id أثناء التحليل.

INSERT INTO github_users
     SELECT user_id, url, UPPER(login), avatar_url, gravatar_id, display_login
       FROM azure_storage.blob_get('pgquickstart', 'github', 'users.csv.gz', NULL::github_users,
                                    options := azure_storage.options_csv_get(force_not_null := ARRAY['gravatar_id']));
INSERT 0 264308

الوصول إلى التخزين الخاص

  1. الحصول على اسم حسابك ومفتاح الوصول

    بدون مفتاح وصول، لن يسمح لنا بإدراج الحاويات التي تم تعيينها إلى مستويات الوصول الخاصة أو Blob.

    SELECT * FROM azure_storage.blob_list('mystorageaccount','privdatasets');
    
    ERROR:  azure_storage: missing account access key
    HINT:  Use SELECT azure_storage.account_add('<account name>', '<access key>')
    

    في حساب التخزين الخاص بك، افتح مفاتيح Access. انسخ اسم حساب التخزين وانسخ قسم Key from key1 (يجب عليك تحديد Show بجوار المفتاح أولا).

    لقطة شاشة لقسم مفاتيح الوصول إلى الأمان + الشبكات > في صفحة Azure Blob Storage في مدخل Microsoft Azure.

  2. إضافة حساب إلى pg_azure_storage

    SELECT azure_storage.account_add('mystorageaccount', 'SECRET_ACCESS_KEY');
    

    الآن يمكنك سرد الحاويات التي تم تعيينها إلى مستويات الوصول الخاصة وBlob لهذا التخزين ولكن فقط كمستخدم citus ، الذي لديه azure_storage_admin الدور الممنوح له. إذا قمت بإنشاء مستخدم جديد باسم support، فلن يسمح له بالوصول إلى محتويات الحاوية بشكل افتراضي.

    SELECT * FROM azure_storage.blob_list('pgabs','dataverse');
    
    ERROR:  azure_storage: current user support is not allowed to use storage account pgabs
    
  3. support السماح للمستخدم باستخدام حساب Azure Blob Storage محدد

    منح الإذن بسيط مثل استدعاء account_user_add.

    SELECT * FROM azure_storage.account_user_add('mystorageaccount', 'support');
    

    يمكننا أن نرى المستخدمين المسموح لهم في إخراج account_list، والذي يعرض جميع الحسابات مع تحديد مفاتيح الوصول.

    SELECT * FROM azure_storage.account_list();
    
     account_name     | allowed_users
    ------------------+---------------
     mystorageaccount | {support}
    (1 row)
    

    إذا قررت من أي وقت مضى، أن المستخدم يجب أن لا يكون لديه حق الوصول بعد الآن. ما عليك سوى استدعاء account_user_remove.

    SELECT * FROM azure_storage.account_user_remove('mystorageaccount', 'support');
    

الخطوات التالية

تهانينا، لقد تعلمت للتو كيفية تحميل البيانات إلى Azure Cosmos DB ل PostgreSQL مباشرة من Azure Blob Storage.