Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, lihat posting blog
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Contoh: Mengimpor modul pustaka Python khusus
Anda mendefinisikan fungsi skalar menggunakan sintaks bahasa Python. Anda dapat menggunakan modul Python Standard Library dan modul Amazon Redshift yang sudah diinstal sebelumnya. Anda juga dapat membuat modul pustaka Python kustom Anda sendiri dan mengimpor pustaka ke cluster Anda, atau menggunakan pustaka yang ada dari Python atau pihak ketiga.
Anda tidak dapat membuat pustaka yang berisi modul dengan nama yang sama dengan modul Pustaka Standar Python atau modul Python yang sudah diinstal sebelumnya Amazon Redshift. Jika pustaka yang diinstal pengguna yang ada menggunakan paket Python yang sama dengan pustaka yang Anda buat, Anda harus menghapus pustaka yang ada sebelum menginstal pustaka baru.
Anda harus menjadi pengguna super atau memiliki USAGE ON LANGUAGE plpythonu hak istimewa untuk menginstal pustaka khusus; namun, setiap pengguna dengan hak istimewa yang cukup untuk membuat fungsi dapat menggunakan pustaka yang diinstal. Anda dapat menanyakan katalog PG_LIBRARY sistem untuk melihat informasi tentang pustaka yang diinstal pada cluster Anda.
Mengimpor modul Python khusus ke cluster Anda
Bagian ini memberikan contoh mengimpor modul Python kustom ke cluster Anda. Untuk melakukan langkah-langkah di bagian ini, Anda harus memiliki bucket Amazon S3, tempat Anda mengunggah paket perpustakaan. Anda kemudian menginstal paket di cluster Anda. Untuk informasi selengkapnya tentang membuat bucket, buka Membuat bucket di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.
Dalam contoh ini, misalkan Anda membuat UDF untuk bekerja dengan posisi dan jarak dalam data Anda. Hubungkan ke cluster Amazon Redshift Anda dari alat klien SQL, dan jalankan perintah berikut untuk membuat fungsi.
CREATE FUNCTION f_distance (x1 float, y1 float, x2 float, y2 float) RETURNS float IMMUTABLE as $$ def distance(x1, y1, x2, y2): import math return math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2) return distance(x1, y1, x2, y2) $$ LANGUAGE plpythonu; CREATE FUNCTION f_within_range (x1 float, y1 float, x2 float, y2 float) RETURNS bool IMMUTABLE as $$ def distance(x1, y1, x2, y2): import math return math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2) return distance(x1, y1, x2, y2) < 20 $$ LANGUAGE plpythonu;
Perhatikan bahwa beberapa baris kode diduplikasi dalam fungsi sebelumnya. Duplikasi ini diperlukan karena UDF tidak dapat mereferensikan isi UDF lain, dan kedua fungsi memerlukan fungsionalitas yang sama. Namun, alih-alih menduplikasi kode dalam beberapa fungsi, Anda dapat membuat pustaka khusus dan mengonfigurasi fungsi Anda untuk menggunakannya.
Untuk melakukannya, pertama buat paket perpustakaan dengan mengikuti langkah-langkah ini:
-
Buat folder bernama geometri. Folder ini adalah paket tingkat atas perpustakaan.
-
Di folder geometri, buat file bernama
__init__.py. Perhatikan bahwa nama file berisi dua karakter garis bawah ganda. File ini menunjukkan kepada Python bahwa paket dapat diinisialisasi. -
Juga di folder geometri, buat folder bernama trig. Folder ini adalah subpaket perpustakaan.
-
Di folder trig, buat file lain bernama
__init__.pydan file bernamaline.py. Dalam folder ini,__init__.pymenunjukkan kepada Python bahwa subpaket dapat diinisialisasi dan ituline.pyadalah file yang berisi kode perpustakaan.Struktur folder dan file Anda harus sama seperti berikut:
geometry/ __init__.py trig/ __init__.py line.pyUntuk informasi lebih lanjut tentang struktur paket, buka Modul
dalam tutorial Python di situs web Python. -
Kode berikut berisi fungsi kelas dan anggota untuk perpustakaan. Salin dan tempel ke
line.py.class LineSegment: def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 def angle(self): import math return math.atan2(self.y2 - self.y1, self.x2 - self.x1) def distance(self): import math return math.sqrt((self.y2 - self.y1) ** 2 + (self.x2 - self.x1) ** 2)
Setelah Anda membuat paket, lakukan hal berikut untuk menyiapkan paket dan mengunggahnya ke Amazon S3.
-
Kompres isi folder geometri menjadi file.zip bernama geometry.zip. Jangan sertakan folder geometri itu sendiri; hanya menyertakan isi folder seperti yang ditunjukkan berikut:
geometry.zip __init__.py trig/ __init__.py line.py -
Ung gah geometry.zip ke bucket Amazon S3 Anda.
penting
Jika bucket Amazon S3 tidak berada di Wilayah yang sama dengan cluster Amazon Redshift Anda, Anda harus menggunakan opsi REGION untuk menentukan Wilayah tempat data berada. Untuk informasi selengkapnya, lihat BUAT PERPUSTAKAAN.
-
Dari alat klien SQL Anda, jalankan perintah berikut untuk menginstal pustaka. Ganti
<bucket_name>dengan nama bucket Anda, dan ganti<access key id>dan<secret key>dengan kunci akses dan kunci akses rahasia dari kredentif pengguna AWS Identity and Access Management (IAM) Anda.CREATE LIBRARY geometry LANGUAGE plpythonu FROM 's3://<bucket_name>/geometry.zip' CREDENTIALS 'aws_access_key_id=<access key id>;aws_secret_access_key=<secret key>';
Setelah Anda menginstal pustaka di cluster Anda, Anda perlu mengonfigurasi fungsi Anda untuk menggunakan pustaka. Untuk melakukan ini, jalankan perintah berikut.
CREATE OR REPLACE FUNCTION f_distance (x1 float, y1 float, x2 float, y2 float) RETURNS float IMMUTABLE as $$ from trig.line import LineSegment return LineSegment(x1, y1, x2, y2).distance() $$ LANGUAGE plpythonu; CREATE OR REPLACE FUNCTION f_within_range (x1 float, y1 float, x2 float, y2 float) RETURNS bool IMMUTABLE as $$ from trig.line import LineSegment return LineSegment(x1, y1, x2, y2).distance() < 20 $$ LANGUAGE plpythonu;
Dalam perintah sebelumnya, import trig/line menghilangkan kode duplikat dari fungsi asli di bagian ini. Anda dapat menggunakan kembali fungsionalitas yang disediakan oleh pustaka ini di beberapa UDF. Perhatikan bahwa untuk mengimpor modul, Anda hanya perlu menentukan jalur ke subpaket dan nama modul (trig/line).