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.
CREATE FUNCTION
Membuat fungsi skalar yang ditentukan pengguna (UDF) baru menggunakan klausa SQL SELECT atau program Python.
Untuk informasi selengkapnya dan contoh tambahan, lihat User-defined fungsi di Amazon Redshift.
Hak istimewa yang diperlukan
Anda harus memiliki izin dengan salah satu cara berikut untuk menjalankan FUNGSI CREATE OR REPLACE:
-
Untuk FUNGSI BUAT:
-
Superuser dapat menggunakan bahasa tepercaya dan tidak tepercaya untuk membuat fungsi.
-
Pengguna dengan hak istimewa CREATE [OR REPLACE] FUNCTION dapat membuat fungsi dengan bahasa tepercaya.
-
-
Untuk FUNGSI GANTI:
-
Superuser
-
Pengguna dengan hak istimewa CREATE [OR REPLACE] FUNCTION
-
Pemilik fungsi
-
Sintaksis
CREATE [ OR REPLACE ] FUNCTION f_function_name ( { [py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] ) RETURNS data_type { VOLATILE | STABLE | IMMUTABLE } AS $$ { python_program | SELECT_clause } $$ LANGUAGE { plpythonu | sql }
Parameter
- ATAU GANTI
-
Menentukan bahwa jika fungsi dengan nama dan tipe data argumen input yang sama, atau tanda tangan, seperti yang ini sudah ada, fungsi yang ada diganti. Anda hanya dapat mengganti fungsi dengan fungsi baru yang mendefinisikan kumpulan tipe data yang identik. Anda harus menjadi superuser untuk mengganti fungsi.
Jika Anda mendefinisikan fungsi dengan nama yang sama dengan fungsi yang ada tetapi tanda tangan yang berbeda, Anda membuat fungsi baru. Dengan kata lain, nama fungsi kelebihan beban. Untuk informasi selengkapnya, lihat Nama fungsi overloading.
- f_nama_fungsi
-
Nama fungsi. Jika Anda menentukan nama skema (seperti
myschema.myfunction), fungsi dibuat menggunakan skema yang ditentukan. Jika tidak, fungsi dibuat dalam skema saat ini. Untuk informasi selengkapnya tentang nama yang valid, lihatNama dan pengenal.Sebaiknya awali semua nama UDF dengan
f_. Amazon Redshift menyimpan awf_alan untuk nama UDF, jadi dengan menggunakanf_awalan, Anda memastikan bahwa nama UDF Anda tidak akan bertentangan dengan nama fungsi SQL bawaan Amazon Redshift yang ada atau yang akan datang. Untuk informasi selengkapnya, lihat Mencegah konflik penamaan UDF.Anda dapat menentukan lebih dari satu fungsi dengan nama fungsi yang sama jika tipe data untuk argumen input berbeda. Dengan kata lain, nama fungsi kelebihan beban. Untuk informasi selengkapnya, lihat Nama fungsi overloading.
- py_arg_nama_py_arg_data_type | sql_arg_data_type
-
Untuk Python UDF, daftar nama argumen input dan tipe data. Untuk SQL UDF, daftar tipe data, tanpa nama argumen. Dalam Python UDF, lihat argumen menggunakan nama argumen. Dalam SQL UDF, lihat argumen menggunakan $1, $2, dan seterusnya, berdasarkan urutan argumen dalam daftar argumen.
Untuk SQL UDF, tipe data input dan return dapat berupa tipe data Amazon Redshift standar apa pun. Untuk Python UDF, tipe data input dan return dapat berupa SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, atau TIMESTAMP. Selain itu, fungsi yang ditentukan pengguna Python (UDF) mendukung tipe data ANYELEMENT. Ini secara otomatis dikonversi ke tipe data standar berdasarkan tipe data dari argumen yang sesuai yang diberikan saat runtime. Jika beberapa argumen menggunakan ANYELEMENT, semuanya diselesaikan ke tipe data yang sama saat runtime, berdasarkan argumen ANYELEMENT pertama dalam daftar. Untuk informasi selengkapnya, lihat Tipe data Python UDF dan Jenis Data.
Anda dapat menentukan maksimum 32 argumen.
- RETURNS data_type
-
Jenis data dari nilai yang dikembalikan oleh fungsi. Tipe data RETURNS dapat berupa tipe data Amazon Redshift standar apa pun. Selain itu, Python UDF dapat menggunakan tipe data ANYELEMENT, yang secara otomatis dikonversi ke tipe data standar berdasarkan argumen yang diberikan saat runtime. Jika Anda menentukan ANYELEMENT untuk tipe data yang dikembalikan, setidaknya satu argumen harus menggunakan ANYELEMENT. Jenis data pengembalian aktual cocok dengan tipe data yang disediakan untuk argumen ANYELEMENT ketika fungsi dipanggil. Untuk informasi selengkapnya, lihat Tipe data Python UDF.
- MUDAH MENGUAP | STABIL | TIDAK BERUBAH
-
Menginformasikan pengoptimal kueri tentang volatilitas fungsi.
Anda akan mendapatkan pengoptimalan terbaik jika Anda memberi label fungsi Anda dengan kategori volatilitas paling ketat yang berlaku untuk itu. Namun, jika kategorinya terlalu ketat, ada risiko bahwa pengoptimal akan secara keliru melewatkan beberapa panggilan, mengakibatkan set hasil yang salah. Dalam urutan ketegasan, dimulai dengan yang paling tidak ketat, kategori volatilitas adalah sebagai berikut:
-
MUDAH MENGUAP
-
STABIL
-
TIDAK BERUBAH
MUDAH MENGUAP
Dengan argumen yang sama, fungsi dapat mengembalikan hasil yang berbeda pada panggilan berturut-turut, bahkan untuk baris dalam satu pernyataan. Pengoptimal kueri tidak dapat membuat asumsi apa pun tentang perilaku fungsi volatile, sehingga kueri yang menggunakan fungsi volatile harus mengevaluasi kembali fungsi untuk setiap baris input.
STABIL
Dengan argumen yang sama, fungsi dijamin mengembalikan hasil yang sama untuk semua baris yang diproses dalam satu pernyataan. Fungsi dapat mengembalikan hasil yang berbeda ketika dipanggil dalam pernyataan yang berbeda. Kategori ini memungkinkan pengoptimal untuk mengoptimalkan beberapa panggilan fungsi dalam satu pernyataan ke satu panggilan untuk pernyataan tersebut.
TIDAK BERUBAH
Dengan argumen yang sama, fungsi selalu mengembalikan hasil yang sama, selamanya. Ketika kueri memanggil
IMMUTABLEfungsi dengan argumen konstan, pengoptimal melakukan pra-evaluasi fungsi. -
- Pernyataan AS $$ $$
-
Konstruksi yang menyertakan pernyataan yang akan dijalankan. Kata kunci literal
AS $$dan$$diperlukan.Amazon Redshift mengharuskan Anda untuk melampirkan pernyataan dalam fungsi Anda dengan menggunakan format yang disebut kuotasi dolar. Apa pun di dalam kandang dilewatkan persis apa adanya. Anda tidak perlu melarikan diri dari karakter khusus karena isi string ditulis secara harfiah.
Dengan kutipan dolar, Anda menggunakan sepasang tanda dolar ($$) untuk menandakan awal dan akhir pernyataan yang akan dijalankan, seperti yang ditunjukkan pada contoh berikut.
$$my statement$$Secara opsional, di antara tanda-tanda dolar di setiap pasangan, Anda dapat menentukan string untuk membantu mengidentifikasi pernyataan. String yang Anda gunakan harus sama di awal dan akhir pasangan penutup. String ini peka huruf besar-kecil, dan mengikuti batasan yang sama dengan pengidentifikasi yang tidak dikutip kecuali bahwa itu tidak dapat berisi tanda dolar. Contoh berikut menggunakan string
test.$test$my statement$test$Untuk informasi lebih lanjut tentang kutipan dolar, lihat "Konstanta Dollar-quoted String” di bawah Struktur Lek sikal
dalam dokumentasi PostgreSQL. - Python Programme
-
Program Python yang dapat dieksekusi yang valid yang mengembalikan nilai. Pernyataan yang Anda berikan dengan fungsi harus sesuai dengan persyaratan lekukan seperti yang ditentukan dalam Panduan Gaya untuk Kode Python
di situs web Python. Untuk informasi selengkapnya, lihat Dukungan bahasa Python untuk UDF. - SQL_klausa
-
Sebuah klausa SQL SELECT.
Klausa SELECT tidak dapat menyertakan salah satu dari jenis klausa berikut:
-
FROM
-
KE DALAM
-
WHERE
-
GROUP BY
-
ORDER BY
-
LIMIT
-
- BAHASA {plpythonu | sql}
-
Untuk Python, tentukan
plpythonu. Untuk SQL, tentukansql. Anda harus memiliki izin untuk penggunaan bahasa untuk SQL atau plpythonu. Untuk informasi selengkapnya, lihat Keamanan dan izin UDF.
Catatan penggunaan
Fungsi bersarang
Anda dapat memanggil fungsi SQL yang ditentukan pengguna lain (UDF) dari dalam SQL UDF. Fungsi bersarang harus ada saat Anda menjalankan perintah CREATE FUNCTION. Amazon Redshift tidak melacak dependensi untuk UDF, jadi jika Anda menghapus fungsi bersarang, Amazon Redshift tidak mengembalikan kesalahan. Namun, UDF akan gagal jika fungsi bersarang tidak ada. Misalnya, fungsi berikut memanggil f_sql_greater
fungsi dalam klausa SELECT.
create function f_sql_commission (float, float ) returns float stable as $$ select f_sql_greater ($1, $2) $$ language sql;
Keamanan dan hak istimewa UDF
Untuk membuat UDF, Anda harus memiliki izin untuk penggunaan bahasa untuk SQL atau plpythonu (Python). Secara default, USAGE ON LANGUAGE SQL diberikan kepada PUBLIK. Namun, Anda harus secara eksplisit memberikan USAGE ON LANGUAGE PLPYTHONU kepada pengguna atau grup tertentu.
Untuk mencabut penggunaan untuk SQL, pertama-tama cabut penggunaan dari PUBLIK. Kemudian berikan penggunaan pada SQL hanya untuk pengguna atau grup tertentu yang diizinkan untuk membuat SQL UDF. Contoh berikut mencabut penggunaan pada SQL dari PUBLIC kemudian memberikan penggunaan ke grup pengguna. udf_devs
revoke usage on language sql from PUBLIC; grant usage on language sql to group udf_devs;
Untuk menjalankan UDF, Anda harus memiliki izin eksekusi untuk setiap fungsi. Secara default, izin eksekusi untuk UDF baru diberikan kepada PUBLIC. Untuk membatasi penggunaan, cabut izin eksekusi dari PUBLIK untuk fungsi tersebut. Kemudian berikan hak istimewa kepada individu atau kelompok tertentu.
Contoh berikut mencabut izin eksekusi pada fungsi f_py_greater dari PUBLIC kemudian memberikan penggunaan ke grup pengguna. udf_devs
revoke execute on function f_py_greater(a float, b float) from PUBLIC; grant execute on function f_py_greater(a float, b float) to group udf_devs;
Pengguna super memiliki semua hak istimewa secara default.
Untuk informasi selengkapnya, lihat HIBAH dan MENCABUT.
Contoh
Contoh UDF Python Scalar
Contoh berikut membuat Python UDF yang membandingkan dua bilangan bulat dan mengembalikan nilai yang lebih besar.
create function f_py_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;
Contoh berikut menanyakan tabel PENJUALAN dan memanggil f_py_greater fungsi baru untuk mengembalikan COMMISSION atau 20 persen dari PRICEPAID, mana yang lebih besar.
select f_py_greater (commission, pricepaid*0.20) from sales;
Contoh UDF SQL Scalar
Contoh berikut menciptakan fungsi yang membandingkan dua angka dan mengembalikan nilai yang lebih besar.
create function f_sql_greater (float, float) returns float stable as $$ select case when $1 > $2 then $1 else $2 end $$ language sql;
Kueri berikut memanggil f_sql_greater fungsi baru untuk menanyakan tabel PENJUALAN dan mengembalikan COMMISSION atau 20 persen dari PRICEPAID, mana yang lebih besar.
select f_sql_greater (commission, pricepaid*0.20) from sales;