View a markdown version of this page

BUAT FUNGSI EKSTERNAL - Amazon Redshift

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 yang diterbitkan pada 30 Juni 2025.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

BUAT FUNGSI EKSTERNAL

Membuat fungsi skalar yang ditentukan pengguna (UDF) berdasarkan AWS Lambda untuk Amazon Redshift. Untuk informasi selengkapnya tentang fungsi yang ditentukan pengguna Lambda, lihat. Skalar Lambda UDF

Hak istimewa yang diperlukan

Berikut ini adalah hak istimewa yang diperlukan untuk CREATE EXTERNAL FUNCTION:

  • Superuser

  • Pengguna dengan hak istimewa CREATE [OR REPLACE] EXTERNAL FUNCTION

Sintaksis

CREATE [ OR REPLACE ] EXTERNAL FUNCTION external_fn_name ( [data_type] [, ...] ) RETURNS data_type { VOLATILE | STABLE } LAMBDA 'lambda_fn_name' IAM_ROLE { default | ‘arn:aws:iam::<Akun AWS-id>:role/<role-name>’ RETRY_TIMEOUT milliseconds MAX_BATCH_ROWS count MAX_BATCH_SIZE size [ KB | MB ];

Parameter

ATAU GANTI

Klausa yang 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.

nama_fn_eksternal

Nama fungsi eksternal. 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 denganf_. Amazon Redshift menyimpan f_ awalan untuk nama UDF. Dengan menggunakan f_ awalan, Anda membantu memastikan bahwa nama UDF Anda tidak akan bertentangan dengan nama fungsi SQL bawaan apa pun untuk Amazon Redshift sekarang atau di masa mendatang. Untuk informasi selengkapnya, lihat Mencegah konflik penamaan UDF.

tipe_data

Jenis data untuk argumen input. Untuk informasi selengkapnya, lihat UDF Python Skalar dan Skalar Lambda UDF.

RETURNS data_type

Jenis data dari nilai yang dikembalikan oleh fungsi. Tipe data RETURNS dapat berupa tipe data Amazon Redshift standar apa pun. Untuk informasi selengkapnya, lihat UDF Python Skalar dan Skalar Lambda UDF.

MUDAH MENGUAP | STABIL

Menginformasikan pengoptimal kueri tentang volatilitas fungsi.

Untuk mendapatkan pengoptimalan terbaik, beri label pada fungsi Anda dengan kategori volatilitas paling ketat yang berlaku untuk itu. Dalam urutan ketegasan, dimulai dengan yang paling tidak ketat, kategori volatilitas adalah sebagai berikut:

  • MUDAH MENGUAP

  • STABIL

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 tentang perilaku fungsi volatile. Kueri yang menggunakan fungsi volatile harus mengevaluasi kembali fungsi untuk setiap input.

STABIL

Dengan argumen yang sama, fungsi dijamin mengembalikan hasil yang sama pada panggilan berturut-turut yang diproses dalam satu pernyataan. Fungsi dapat mengembalikan hasil yang berbeda ketika dipanggil dalam pernyataan yang berbeda. Kategori ini membuatnya sehingga pengoptimal dapat mengurangi berapa kali fungsi dipanggil dalam satu pernyataan.

Perhatikan bahwa jika ketegasan yang dipilih tidak valid untuk fungsi, ada risiko bahwa pengoptimal mungkin melewatkan beberapa panggilan berdasarkan keketatan ini. Ini dapat mengakibatkan set hasil yang salah.

Klausa IMMUTABLE saat ini tidak didukung untuk UDF Lambda.

LAMBDA 'lambda_fn_name'

Nama fungsi yang dipanggil Amazon Redshift.

Untuk langkah-langkah membuat AWS Lambda fungsi, lihat Membuat fungsi Lambda dengan konsol di Panduan Peng AWS Lambda embang.

Untuk informasi mengenai izin yang diperlukan untuk fungsi Lambda, lihat AWS Lambda izin di Panduan Peng AWS Lambda embang.

IAM_ROLE {default | 'arn:aws:iam: :rol/ '<Akun AWS-id><role-name>

Gunakan kata kunci default agar Amazon Redshift menggunakan peran IAM yang ditetapkan sebagai default dan terkait dengan cluster saat perintah CREATE EXTERNAL FUNCTION berjalan.

Gunakan Nama Sumber Daya Amazon (ARN) untuk peran IAM yang digunakan cluster Anda untuk otentikasi dan otorisasi. Perintah CREATE EXTERNAL FUNCTION diotorisasi untuk memanggil fungsi Lambda melalui peran IAM ini. Jika cluster Anda memiliki peran IAM yang ada dengan izin untuk memanggil fungsi Lambda yang terlampir, Anda dapat mengganti ARN peran Anda. Untuk informasi selengkapnya, lihat Mengkonfigurasi parameter otorisasi untuk Lambda UDF.

Berikut ini menunjukkan sintaks untuk parameter IAM_ROLE.

IAM_ROLE 'arn:aws:iam::aws-account-id:role/role-name'
RETRY_TIMEOUT milidetik

Jumlah total waktu dalam milidetik yang digunakan Amazon Redshift untuk penundaan balik percobaan ulang.

Alih-alih mencoba lagi segera untuk kueri yang gagal, Amazon Redshift melakukan backoff dan menunggu sejumlah waktu tertentu di antara percobaan ulang. Kemudian Amazon Redshift mencoba lagi permintaan untuk menjalankan kembali kueri yang gagal sampai jumlah semua penundaan sama dengan atau melebihi nilai RETRY_TIMEOUT yang Anda tentukan. Nilai defaultnya adalah 20.000 milidetik.

Saat fungsi Lambda dipanggil, Amazon Redshift mencoba lagi untuk kueri yang menerima kesalahan sepertiTooManyRequestsException,, dan. EC2ThrottledException ServiceException

Anda dapat mengatur parameter RETRY_TIMEOUT ke 0 milidetik untuk mencegah percobaan ulang untuk UDF Lambda.

Jumlah MAX_BATCH_ROWS

Jumlah maksimum baris yang dikirim Amazon Redshift dalam permintaan batch tunggal untuk satu pemanggilan lambda.

Nilai minimum parameter ini adalah 1. Nilai maksimum adalah INT_MAX, atau 2.147.483.647.

Parameter ini bersifat opsional. Nilai defaultnya adalah INT_MAX, atau 2.147.483.647.

Ukuran BATCH_MAKSIMUM [KB | MB]

Ukuran maksimum muatan data yang dikirim Amazon Redshift dalam permintaan batch tunggal untuk satu pemanggilan lambda.

Nilai minimum parameter ini adalah 1 KB. Nilai maksimum adalah 5 MB.

Nilai default parameter ini adalah 5 MB.

KB dan MB bersifat opsional. Jika Anda tidak menyetel unit pengukuran, Amazon Redshift secara default menggunakan KB.

Catatan penggunaan

Pertimbangkan hal berikut saat Anda membuat UDF Lambda:

  • Urutan panggilan fungsi Lambda pada argumen input tidak tetap atau dijamin. Ini mungkin bervariasi antara instance kueri yang sedang berjalan, tergantung pada konfigurasi cluster.

  • Fungsi tidak dijamin akan diterapkan pada setiap argumen input sekali dan hanya sekali. Interaksi antara Amazon Redshift dan AWS Lambda mungkin menyebabkan panggilan berulang dengan input yang sama.

Contoh

Berikut ini adalah contoh penggunaan fungsi yang ditentukan pengguna (UDF) skalar Lambda.

Contoh UDF Scalar Lambda menggunakan fungsi Lambda Node.js

Contoh berikut menciptakan fungsi eksternal yang disebut exfunc_sum yang mengambil dua bilangan bulat sebagai argumen input. Fungsi ini mengembalikan jumlah sebagai output integer. Nama fungsi Lambda yang akan dipanggil adalahlambda_sum. Bahasa yang digunakan untuk fungsi Lambda ini adalah Node.js 12.x. Pastikan untuk menentukan peran IAM. Contoh digunakan 'arn:aws:iam::123456789012:user/johndoe' sebagai peran IAM.

CREATE EXTERNAL FUNCTION exfunc_sum(INT,INT) RETURNS INT VOLATILE LAMBDA 'lambda_sum' IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';

Fungsi Lambda mengambil payload permintaan dan mengulangi setiap baris. Semua nilai dalam satu baris ditambahkan untuk menghitung jumlah untuk baris itu, yang disimpan dalam array respons. Jumlah baris dalam array hasil mirip dengan jumlah baris yang diterima dalam payload permintaan.

Payload respons JSON harus memiliki data hasil di bidang 'hasil' agar dapat dikenali oleh fungsi eksternal. Bidang argumen dalam permintaan yang dikirim ke fungsi Lambda berisi payload data. Mungkin ada beberapa baris dalam payload data jika ada permintaan batch. Fungsi Lambda berikut mengulangi semua baris dalam payload data permintaan. Ini juga secara individual mengulangi semua nilai dalam satu baris.

exports.handler = async (event) => { // The 'arguments' field in the request sent to the Lambda function contains the data payload. var t1 = event['arguments']; // 'len(t1)' represents the number of rows in the request payload. // The number of results in the response payload should be the same as the number of rows received. const resp = new Array(t1.length); // Iterating over all the rows in the request payload. for (const [i, x] of t1.entries()) { var sum = 0; // Iterating over all the values in a single row. for (const y of x) { sum = sum + y; } resp[i] = sum; } // The 'results' field should contain the results of the lambda call. const response = { results: resp }; return JSON.stringify(response); };

Contoh berikut memanggil fungsi eksternal dengan nilai literal.

select exfunc_sum(1,2); exfunc_sum ------------ 3 (1 row)

Contoh berikut membuat tabel yang disebut t_sum dengan dua kolom, c1 dan c2, dari tipe data integer dan menyisipkan dua baris data. Kemudian fungsi eksternal dipanggil dengan meneruskan nama kolom tabel ini. Dua baris tabel dikirim dalam permintaan batch dalam payload permintaan sebagai pemanggilan Lambda tunggal.

CREATE TABLE t_sum(c1 int, c2 int); INSERT INTO t_sum VALUES (4,5), (6,7); SELECT exfunc_sum(c1,c2) FROM t_sum; exfunc_sum --------------- 9 13 (2 rows)

Contoh UDF Scalar Lambda menggunakan atribut RETRY_TIMEOUT

Pada bagian berikut, Anda dapat menemukan contoh cara menggunakan atribut RETRY_TIMEOUT di Lambda UDF.

AWS Lambda fungsi memiliki batas konkurensi yang dapat Anda tetapkan untuk setiap fungsi. Untuk informasi selengkapnya tentang batas konkurensi, lihat M engelola konkurensi untuk fungsi Lambda di Panduan Peng AWS Lambda embang dan posting M engelola Koncurrency AWS Lambda Fungsi di Blog Komputasi. AWS

Ketika jumlah permintaan yang dilayani oleh UDF Lambda melebihi batas konkurensi, permintaan baru menerima kesalahan. TooManyRequestsException Lambda UDF mencoba lagi pada kesalahan ini sampai jumlah semua penundaan antara permintaan yang dikirim ke fungsi Lambda sama dengan atau melebihi nilai RETRY_TIMEOUT yang Anda tetapkan. Nilai RETRY_TIMEOUT default adalah 20.000 milidetik.

Contoh berikut menggunakan fungsi Lambda bernamaexfunc_sleep_3. Fungsi ini mengambil payload permintaan, mengulangi setiap baris, dan mengubah input menjadi huruf besar. Kemudian tidur selama 3 detik dan mengembalikan hasilnya. Bahasa yang digunakan untuk fungsi Lambda ini adalah Python 3.8.

Jumlah baris dalam array hasil mirip dengan jumlah baris yang diterima dalam payload permintaan. Payload respons JSON harus memiliki data hasil di results lapangan agar dapat dikenali oleh fungsi eksternal. Bid arguments ang dalam permintaan yang dikirim ke fungsi Lambda berisi payload data. Dalam kasus permintaan batch, beberapa baris dapat muncul di payload data.

Batas konkurensi untuk fungsi ini secara khusus diatur ke 1 dalam konkurensi yang dicadangkan untuk menunjukkan penggunaan atribut RETRY_TIMEOUT. Ketika atribut diatur ke 1, fungsi Lambda hanya dapat melayani satu permintaan pada satu waktu.

import json import time def lambda_handler(event, context): t1 = event['arguments'] # 'len(t1)' represents the number of rows in the request payload. # The number of results in the response payload should be the same as the number of rows received. resp = [None]*len(t1) # Iterating over all rows in the request payload. for i, x in enumerate(t1): # Iterating over all the values in a single row. for j, y in enumerate(x): resp[i] = y.upper() time.sleep(3) ret = dict() ret['results'] = resp ret_json = json.dumps(ret) return ret_json

Berikut ini, dua contoh tambahan menggambarkan atribut RETRY_TIMEOUT. Mereka masing-masing memanggil satu Lambda UDF. Saat memanggil Lambda UDF, setiap contoh menjalankan query SQL yang sama untuk memanggil Lambda UDF dari dua sesi database bersamaan pada saat yang sama. Ketika kueri pertama yang memanggil Lambda UDF sedang dilayani oleh UDF, kueri kedua menerima kesalahan. TooManyRequestsException Hasil ini terjadi karena Anda secara khusus mengatur konkurensi yang dicadangkan di UDF ke 1. Untuk informasi tentang cara menyetel konkurensi yang dicadangkan untuk fungsi Lambda, lihat Mengonfigurasi konkurensi yang dic adangkan.

Contoh pertama, berikut, menetapkan atribut RETRY_TIMEOUT untuk Lambda UDF ke 0 milidetik. Jika permintaan Lambda menerima pengecualian dari fungsi Lambda, Amazon Redshift tidak melakukan percobaan ulang apa pun. Hasil ini terjadi karena atribut RETRY_TIMEOUT diatur ke 0.

CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar) RETURNS varchar VOLATILE LAMBDA 'exfunc_sleep_3' IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test' RETRY_TIMEOUT 0;

Dengan RETRY_TIMEOUT disetel ke 0, Anda dapat menjalankan dua kueri berikut dari sesi database terpisah untuk melihat hasil yang berbeda.

Query SQL pertama yang menggunakan Lambda UDF berjalan dengan sukses.

select exfunc_upper('Varchar'); exfunc_upper -------------- VARCHAR (1 row)

Kueri kedua, yang dijalankan dari sesi database terpisah pada saat yang sama, menerima TooManyRequestsException kesalahan.

select exfunc_upper('Varchar'); ERROR: Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1 DETAIL: ----------------------------------------------- error: Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1 code: 32103 context:query: 0 location: exfunc_client.cpp:102 process: padbmaster [pid=26384] -----------------------------------------------

Contoh kedua, berikut, menetapkan atribut RETRY_TIMEOUT untuk Lambda UDF menjadi 3.000 milidetik. Bahkan jika kueri kedua dijalankan secara bersamaan, Lambda UDF mencoba lagi sampai total penundaan adalah 3.000 milidetik. Dengan demikian, kedua query berjalan dengan sukses.

CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar) RETURNS varchar VOLATILE LAMBDA 'exfunc_sleep_3' IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test' RETRY_TIMEOUT 3000;

Dengan RETRY_TIMEOUT disetel ke 3.000 milidetik, Anda dapat menjalankan dua kueri berikut dari sesi database terpisah untuk melihat hasil yang sama.

Query SQL pertama yang menjalankan Lambda UDF berjalan dengan sukses.

select exfunc_upper('Varchar'); exfunc_upper -------------- VARCHAR (1 row)

Kueri kedua berjalan secara bersamaan, dan Lambda UDF mencoba lagi sampai total penundaan adalah 3.000 milidetik.

select exfunc_upper('Varchar'); exfunc_upper -------------- VARCHAR (1 row)

Contoh UDF Scalar Lambda menggunakan fungsi Python Lambda

Contoh berikut membuat fungsi eksternal yang diberi nama exfunc_multiplication dan yang mengalikan angka dan mengembalikan bilangan bulat. Contoh ini menggabungkan keberhasilan dan error_msg bidang dalam respons Lambda. Bidang sukses diatur ke false ketika ada luapan bilangan bulat dalam hasil perkalian, dan error_msg pesan disetel keInteger multiplication overflow. exfunc_multiplicationFungsi mengambil tiga bilangan bulat sebagai argumen input dan mengembalikan jumlah sebagai output integer.

Nama fungsi Lambda yang dipanggil adalahlambda_multiplication. Bahasa yang digunakan untuk fungsi Lambda ini adalah Python 3.8. Pastikan untuk menentukan peran IAM.

CREATE EXTERNAL FUNCTION exfunc_multiplication(int, int, int) RETURNS INT VOLATILE LAMBDA 'lambda_multiplication' IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';

Fungsi Lambda mengambil payload permintaan dan mengulangi setiap baris. Semua nilai dalam satu baris dikalikan untuk menghitung hasil untuk baris itu, yang disimpan dalam daftar respons. Contoh ini menggunakan nilai sukses Boolean yang disetel ke true secara default. Jika hasil perkalian untuk baris memiliki luapan bilangan bulat, maka nilai keberhasilan diatur ke false. Kemudian loop iterasi putus.

Saat membuat payload respons, jika nilai keberhasilan salah, fungsi Lambda berikut menambahkan error_msg bidang dalam payload. Ini juga mengatur pesan kesalahan keInteger multiplication overflow. Jika nilai keberhasilan benar, maka data hasil ditambahkan di bidang hasil. Jumlah baris dalam array hasil, jika ada, mirip dengan jumlah baris yang diterima dalam payload permintaan.

Bidang argumen dalam permintaan yang dikirim ke fungsi Lambda berisi payload data. Mungkin ada beberapa baris dalam payload data jika ada permintaan batch. Fungsi Lambda berikut mengulangi semua baris dalam payload data permintaan dan secara individual mengulangi semua nilai dalam satu baris.

import json def lambda_handler(event, context): t1 = event['arguments'] # 'len(t1)' represents the number of rows in the request payload. # The number of results in the response payload should be the same as the number of rows received. resp = [None]*len(t1) # By default success is set to 'True'. success = True # Iterating over all rows in the request payload. for i, x in enumerate(t1): mul = 1 # Iterating over all the values in a single row. for j, y in enumerate(x): mul = mul*y # Check integer overflow. if (mul >= 9223372036854775807 or mul <= -9223372036854775808): success = False break else: resp[i] = mul ret = dict() ret['success'] = success if not success: ret['error_msg'] = "Integer multiplication overflow" else: ret['results'] = resp ret_json = json.dumps(ret) return ret_json

Contoh berikut memanggil fungsi eksternal dengan nilai literal.

SELECT exfunc_multiplication(8, 9, 2); exfunc_multiplication --------------------------- 144 (1 row)

Contoh berikut membuat tabel bernama t_multi dengan tiga kolom, c1, c2, dan c3, dari tipe data integer. Fungsi eksternal dipanggil dengan meneruskan nama kolom tabel ini. Data dimasukkan sedemikian rupa untuk menyebabkan luapan bilangan bulat untuk menunjukkan bagaimana kesalahan disebarkan.

CREATE TABLE t_multi (c1 int, c2 int, c3 int); INSERT INTO t_multi VALUES (2147483647, 2147483647, 4); SELECT exfunc_multiplication(c1, c2, c3) FROM t_multi; DETAIL: ----------------------------------------------- error: Integer multiplication overflow code: 32004context: context: query: 38 location: exfunc_data.cpp:276 process: query2_16_38 [pid=30494] -----------------------------------------------