CREATE EXTERNAL FUNCTION - Amazon Redshift

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

CREATE EXTERNAL FUNCTION

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

Hak istimewa yang diperlukan

Berikut ini adalah hak istimewa yang diperlukan untuk CREATE EXTERNALFUNCTION:

  • Superuser

  • Pengguna dengan hak EXTERNAL FUNCTION istimewa CREATE [ORREPLACE]

Sintaks

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 REPLACE

Sebuah klausa yang menentukan bahwa jika fungsi dengan nama yang sama dan tipe data argumen masukan, atau tanda tangan, karena 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.

external_fn_name

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 pengidentifikasi.

Kami menyarankan Anda mengawali semua UDF nama denganf_. Amazon Redshift mencadangkan f_ awalan untuk nama. UDF Dengan menggunakan f_ awalan, Anda membantu memastikan bahwa UDF nama Anda tidak akan bertentangan dengan nama SQL fungsi bawaan apa pun untuk Amazon Redshift sekarang atau di masa mendatang. Untuk informasi selengkapnya, lihat Penamaan UDFs.

data_type

Tipe data untuk argumen masukan. Untuk informasi selengkapnya, lihat Jenis data.

RETURNSdata_type

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

VOLATILE | STABLE

Menginformasikan pengoptimal kueri tentang volatilitas fungsi.

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

  • VOLATILE

  • STABLE

VOLATILE

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.

STABLE

Dengan argumen yang sama, fungsi dijamin untuk mengembalikan hasil yang sama pada panggilan berturut-turut yang diproses dalam satu pernyataan. Fungsi ini 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 keketatan yang dipilih tidak valid untuk fungsi tersebut, ada risiko bahwa pengoptimal mungkin melewatkan beberapa panggilan berdasarkan keketatan ini. Hal ini dapat mengakibatkan set hasil yang salah.

IMMUTABLEKlausul saat ini tidak didukung untuk LambdaUDFs.

LAMBDA'nama lambda_fn_'

Nama fungsi yang dipanggil Amazon Redshift.

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

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

IAM_ ROLE {default | 'arn:aws:iam::<Akun AWS-id>:peran/<role-name>

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

Gunakan Amazon Resource Name (ARN) untuk IAM peran yang digunakan klaster Anda untuk autentikasi dan otorisasi. CREATEEXTERNALFUNCTIONPerintah diizinkan untuk memanggil fungsi Lambda melalui IAM peran ini. Jika klaster Anda memiliki IAM peran yang sudah ada dengan izin untuk memanggil fungsi Lambda yang dilampirkan, Anda dapat mengganti peran Anda. ARN Untuk informasi selengkapnya, lihat Mengkonfigurasi parameter otorisasi untuk Lambda UDFs.

Berikut ini menunjukkan sintaks untuk ROLE parameter IAM _.

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 backoff coba lagi.

Alih-alih mencoba kembali segera untuk kueri yang gagal, Amazon Redshift melakukan backoff dan menunggu waktu tertentu di antara percobaan ulang. Kemudian Amazon Redshift mencoba ulang permintaan untuk menjalankan kembali kueri yang gagal hingga 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 ulang kueri yang menerima kesalahan seperti,, dan. TooManyRequestsException EC2ThrottledException ServiceException

Anda dapat mengatur TIMEOUT parameter RETRY _ ke 0 milidetik untuk mencegah percobaan ulang untuk Lambda. UDF

MAX_ BATCH _ ROWS menghitung

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

Nilai minimum parameter ini adalah 1. Nilai maksimumnya adalah INT _MAX, atau 2.147.483.647.

Parameter ini bersifat opsional. Nilai defaultnya adalah INT _MAX, atau 2.147,483.647.

MAX_ BATCH _ SIZE ukuran [KB | MB]

Ukuran maksimum payload data yang dikirimkan Amazon Redshift dalam satu permintaan batch untuk satu pemanggilan lambda.

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

Nilai default parameter ini adalah 5 MB.

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

Catatan penggunaan

Pertimbangkan hal berikut saat Anda membuat LambdaUDFs:

  • Urutan panggilan fungsi Lambda pada argumen input tidak diperbaiki atau dijamin. Ini mungkin berbeda antara contoh kueri yang berjalan, tergantung pada konfigurasi cluster.

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

Contoh

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

Contoh Skalar UDF Lambda menggunakan fungsi Lambda Node.js

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

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 iterasi di setiap baris. Semua nilai dalam satu baris ditambahkan untuk menghitung jumlah untuk baris itu, yang disimpan dalam array respons. Jumlah baris dalam larik hasil mirip dengan jumlah baris yang diterima dalam payload permintaan.

Payload JSON respons 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 terjadi permintaan batch. Fungsi Lambda berikut iterasi atas 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 melewatkan 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 Skalar UDF Lambda menggunakan atribut _ RETRY TIMEOUT

Di bagian berikut, Anda dapat menemukan contoh cara menggunakan TIMEOUT atribut RETRY _ di LambdaUDFs.

AWS Lambda fungsi memiliki batas konkurensi yang dapat Anda atur untuk setiap fungsi. Untuk informasi selengkapnya tentang batas konkurensi, lihat Mengelola konkurensi untuk fungsi Lambda di Panduan AWS Lambda Pengembang dan posting Mengelola Konkurensi AWS Lambda Fungsi di Blog Komputasi. AWS

Ketika jumlah permintaan yang dilayani oleh Lambda UDF melebihi batas konkurensi, permintaan baru menerima kesalahan. TooManyRequestsException Lambda UDF mencoba ulang kesalahan ini hingga jumlah semua penundaan antara permintaan yang dikirim ke fungsi Lambda sama dengan atau melebihi nilai _ yang Anda tetapkanRETRY. TIMEOUT TIMEOUTNilai RETRY _ default adalah 20.000 milidetik.

Contoh berikut menggunakan fungsi Lambda bernama. exfunc_sleep_3 Fungsi ini mengambil payload permintaan, iterasi di 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 larik hasil mirip dengan jumlah baris yang diterima dalam payload permintaan. Payload JSON respons harus memiliki data hasil di results lapangan agar dapat dikenali oleh fungsi eksternal. argumentsBidang dalam permintaan yang dikirim ke fungsi Lambda berisi muatan data. Dalam kasus permintaan batch, beberapa baris dapat muncul di payload data.

Batas konkurensi untuk fungsi ini secara khusus diatur ke 1 dalam konkurensi cadangan 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 TIMEOUT atribut RETRY _. Mereka masing-masing memanggil satu LambdaUDF. Saat menjalankan UDF Lambda, setiap contoh menjalankan kueri SQL yang sama untuk memanggil UDF Lambda dari dua sesi database bersamaan pada saat yang bersamaan. Saat kueri pertama yang memanggil UDF Lambda dilayani oleh kueri kedua, UDF kueri kedua menerima TooManyRequestsException kesalahan. Hasil ini terjadi karena Anda secara khusus mengatur konkurensi cadangan UDF ke 1. Untuk informasi tentang cara menyetel konkurensi cadangan untuk fungsi Lambda, lihat Mengonfigurasi konkurensi cadangan.

Contoh pertama, berikut, menetapkan TIMEOUT atribut RETRY _ untuk Lambda UDF ke 0 milidetik. Jika permintaan Lambda menerima pengecualian apa pun dari fungsi Lambda, Amazon Redshift tidak akan mencoba lagi. Hasil ini terjadi karena TIMEOUT atribut RETRY _ 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.

SQLKueri 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 TIMEOUT atribut RETRY _ untuk Lambda UDF menjadi 3.000 milidetik. Bahkan jika kueri kedua dijalankan secara bersamaan, UDF Lambda mencoba ulang hingga total penundaan adalah 3.000 milidetik. Dengan demikian, kedua kueri 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.

SQLKueri pertama yang menjalankan Lambda UDF berjalan dengan sukses.

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

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

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

Contoh Skalar UDF Lambda menggunakan fungsi Lambda Python

Contoh berikut menciptakan fungsi eksternal yang bernama exfunc_multiplication dan yang mengalikan angka dan mengembalikan integer. 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 ke. Integer multiplication overflow exfunc_multiplicationFungsi ini mengambil tiga bilangan bulat sebagai argumen masukan dan mengembalikan jumlah sebagai output integer.

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

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 iterasi di setiap baris. Semua nilai dalam satu baris dikalikan untuk menghitung hasil untuk baris itu, yang disimpan dalam daftar respons. Contoh ini menggunakan nilai keberhasilan Boolean yang diatur ke true secara default. Jika hasil perkalian untuk baris memiliki overflow integer, maka nilai keberhasilan disetel ke false. Kemudian loop iterasi rusak.

Saat membuat payload respons, jika nilai keberhasilannya salah, fungsi Lambda berikut menambahkan bidang error_msg di payload. Ini juga mengatur pesan kesalahan keInteger multiplication overflow. Jika nilai keberhasilan benar, maka data hasil ditambahkan di bidang hasil. Jumlah baris dalam larik 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 terjadi 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 melewatkan nama kolom tabel ini. Data dimasukkan sedemikian rupa untuk menyebabkan integer overflow 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] -----------------------------------------------