

 Amazon Redshift tidak akan lagi mendukung pembuatan Python UDFs baru mulai Patch 198. Python yang ada UDFs akan terus berfungsi hingga 30 Juni 2026. Untuk informasi lebih lanjut, lihat [posting blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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

# Dukungan bahasa Python untuk UDFs
<a name="udf-python-language-support"></a>

Anda dapat membuat UDF khusus berdasarkan bahasa pemrograman Python. [Pustaka standar Python 2.7](https://docs.python.org/2/library/index.html) tersedia untuk digunakan UDFs, dengan pengecualian modul berikut:
+ ScrolledText
+ Tix
+ Tkinter
+ tk
+ kura-kura
+ smtpd

Selain Perpustakaan Standar Python, modul berikut adalah bagian dari implementasi Amazon Redshift:
+ [numpy 1.8.2](http://www.numpy.org/)
+ [panda 0.14.1](https://pandas.pydata.org/)
+ [python tanggal 2.2](https://dateutil.readthedocs.org/en/latest/)
+ [pytz 2014.7](https://pypi.org/project/pytz/2014.7/)
+ [scipy 0.12.1](https://www.scipy.org/)
+ [enam 1.3.0](https://pypi.org/project/six/1.3.0/)
+ [wsgiref 0.1.2](https://pypi.python.org/pypi/wsgiref)

Anda juga dapat mengimpor modul Python kustom Anda sendiri dan membuatnya tersedia untuk digunakan UDFs dengan menjalankan perintah. [BUAT PUSTAKA](r_CREATE_LIBRARY.md) Untuk informasi selengkapnya, lihat [Contoh: Mengimpor modul pustaka Python kustom](udf-importing-custom-python-library-modules.md).

**penting**  
Amazon Redshift memblokir semua akses jaringan dan menulis akses ke sistem file melalui. UDFs

**catatan**  
Python 3 tidak tersedia untuk Python. UDFs Untuk mendapatkan dukungan Python 3 untuk Amazon UDFs Redshift, gunakan sebagai gantinya. [Lambda Skalar UDFs](udf-creating-a-lambda-sql-udf.md)

# Contoh: Mengimpor modul pustaka Python kustom
<a name="udf-importing-custom-python-library-modules"></a>

Anda mendefinisikan fungsi skalar menggunakan sintaks bahasa Python. Anda dapat menggunakan modul Python Standard Library dan modul prainstal Amazon Redshift. Anda juga dapat membuat modul pustaka Python kustom Anda sendiri dan mengimpor pustaka ke dalam 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 Perpustakaan Standar Python atau modul Python Amazon Redshift yang sudah diinstal sebelumnya. 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\$1LIBRARY](r_PG_LIBRARY.md) sistem untuk melihat informasi tentang pustaka yang diinstal pada klaster Anda.

## Mengimpor modul Python khusus ke cluster Anda
<a name="udf-import-custom-python-module-procedure"></a>

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 ember](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html) di *Panduan Pengguna Layanan Penyimpanan Sederhana Amazon*.

Dalam contoh ini, misalkan Anda membuat UDFs untuk bekerja dengan posisi dan jarak dalam data Anda. Connect 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 tersebut 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-tama buat paket perpustakaan dengan mengikuti langkah-langkah berikut: 

1. Buat folder bernama **geometri**. Folder ini adalah paket tingkat atas perpustakaan.

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

1. Juga di folder **geometri**, buat folder bernama **trig**. Folder ini adalah subpaket dari perpustakaan.

1. Di folder **trig**, buat file lain bernama `__init__.py` dan file bernama`line.py`. Dalam folder ini, `__init__.py` menunjukkan kepada Python bahwa subpaket dapat diinisialisasi dan itu `line.py` adalah file yang berisi kode perpustakaan.

   Folder dan struktur file Anda harus sama dengan yang berikut: 

   ```
   geometry/
      __init__.py
      trig/
         __init__.py
         line.py
   ```

    Untuk informasi lebih lanjut tentang struktur paket, buka [Modul](https://docs.python.org/2/tutorial/modules.html) dalam tutorial Python di situs web Python. 

1.  Kode berikut berisi kelas dan fungsi 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. 

1. **Kompres isi folder **geometri** menjadi file.zip bernama geometry.zip.** Jangan sertakan folder **geometri** itu sendiri; hanya sertakan isi folder seperti yang ditunjukkan berikut: 

   ```
   geometry.zip
      __init__.py
      trig/
         __init__.py
         line.py
   ```

1. Unggah **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 PUSTAKA](r_CREATE_LIBRARY.md).

1.  Dari alat klien SQL Anda, jalankan perintah berikut untuk menginstal perpustakaan. Ganti *<bucket\$1name>* dengan nama bucket Anda, dan ganti *<access key id>* dan *<secret key>* dengan kunci akses dan kunci akses rahasia dari kredenal 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 mengkonfigurasi fungsi Anda untuk menggunakan perpustakaan. 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;
```

Pada perintah sebelumnya, `import trig/line` hilangkan kode duplikat dari fungsi asli di bagian ini. Anda dapat menggunakan kembali fungsionalitas yang disediakan oleh pustaka ini dalam beberapa UDFs. Perhatikan bahwa untuk mengimpor modul, Anda hanya perlu menentukan jalur ke subpaket dan nama modul (`trig/line`). 