Siapkan penyortiran khusus bahasa untuk hasil kueri Amazon Redshift menggunakan UDF Python skalar - AWS Prescriptive Guidance

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

Siapkan penyortiran khusus bahasa untuk hasil kueri Amazon Redshift menggunakan UDF Python skalar

Ethan Stark, Amazon Web Services

Ringkasan

Pola ini menyediakan langkah-langkah dan kode contoh untuk menggunakan skalar Python UDF (fungsi yang ditentukan pengguna) untuk menyiapkan penyortiran linguistik yang tidak peka huruf besar/kecil untuk hasil kueri Amazon Redshift. Anda perlu menggunakan UDF Python skalar karena Amazon Redshift mengembalikan hasil berdasarkan urutan UTF-8 biner dan tidak mendukung penyortiran khusus bahasa. UDF Python adalah kode pemrosesan non-SQL yang didasarkan pada program Python 2.7 dan berjalan di gudang data. Anda dapat menjalankan kode UDF Python dengan pernyataan SQL dalam satu query. Untuk informasi selengkapnya, lihat Pengantar Python UDFs di postingan Blog Big Data Amazon Redshift AWS.

Data sampel dalam pola ini didasarkan pada alfabet Turki untuk tujuan demonstrasi. UDF Python skalar dalam pola ini dibuat untuk membuat hasil kueri default Amazon Redshift sesuai dengan urutan linguistik karakter dalam bahasa Turki. Untuk informasi selengkapnya, lihat contoh bahasa Turki di bagian Informasi tambahan dari pola ini. Anda dapat memodifikasi UDF Python skalar dalam pola ini untuk bahasa lain.

Prasyarat dan batasan

Prasyarat

  • Cluster Amazon Redshift dengan database, skema, dan tabel

  • Pengguna Amazon Redshift dengan izin CREATE TABLE dan CREATE FUNCTION

  • Python 2.7 atau yang lebih baru

Batasan

Penyortiran linguistik yang digunakan oleh kueri dalam pola ini tidak peka huruf besar/kecil.

Arsitektur

Tumpukan teknologi

  • Amazon Redshift

  • Python UDF

Alat

Layanan AWS

  • Amazon Redshift adalah layanan gudang data skala petabyte terkelola di AWS Cloud. Amazon Redshift terintegrasi dengan data lake Anda, yang memungkinkan Anda menggunakan data Anda untuk memperoleh wawasan baru untuk bisnis dan pelanggan Anda.

Alat-alat lainnya

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat tabel untuk data sampel Anda.

Untuk membuat tabel di Amazon Redshift dan menyisipkan data sampel ke dalam tabel, gunakan pernyataan SQL berikut:

CREATE TABLE my_table (first_name varchar(30)); INSERT INTO my_table (first_name) VALUES ('ali'), ('Ali'), ('ırmak'), ('IRMAK'), ('irem'), ('İREM'), ('oğuz'), ('OĞUZ'), ('ömer'), ('ÖMER'), ('sedat'), ('SEDAT'), ('şule'),
catatan

Nama depan dalam data sampel termasuk karakter khusus dari alfabet Turki. Untuk informasi lebih lanjut tentang pertimbangan bahasa Turki untuk contoh ini, lihat contoh bahasa Turki di bagian Informasi tambahan dari pola ini.

Insinyur data

Periksa penyortiran default dari data sampel.

Untuk melihat pengurutan default data sampel Anda di Amazon Redshift, jalankan kueri berikut:

SELECT first_name FROM my_table ORDER BY first_name;

Kueri mengembalikan daftar nama depan dari tabel yang Anda buat sebelumnya:

first_name --------------- Ali IRMAK OĞUZ SEDAT ali irem oğuz sedat ÖMER ömer İREM ırmak ŞULE şule

Hasil kueri tidak dalam urutan yang benar karena urutan UTF-8 biner default tidak mengakomodasi urutan linguistik karakter khusus Turki.

Insinyur data

Buat UDF Python skalar.

Untuk membuat UDF Python skalar, gunakan kode SQL berikut: 

CREATE OR REPLACE FUNCTION collate_sort (value varchar) RETURNS varchar IMMUTABLE AS $$ def sort_str(val): import string dictionary = { 'I': 'ı', 'ı': 'h~', 'İ': 'i', 'Ş': 's~', 'ş': 's~', 'Ğ': 'g~', 'ğ': 'g~', 'Ü': 'u~', 'ü': 'u~', 'Ö': 'o~', 'ö': 'o~', 'Ç': 'c~', 'ç': 'c~' } for key, value in dictionary.items(): val = val.replace(key, value) return val.lower() return sort_str(value) $$ LANGUAGE plpythonu;
Insinyur data

Kueri data sampel.

Untuk melakukan query data sampel dengan menggunakan UDF Python, jalankan query SQL berikut:

SELECT first_name FROM my_table ORDER BY collate_order(first_name);

Kueri sekarang mengembalikan data sampel dalam urutan linguistik Turki:

first_name --------------- ali Ali ırmak IRMAK irem İREM oğuz OĞUZ ömer Ömer sedat SEDAT şule ŞULE
Insinyur data

Sumber daya terkait

Informasi tambahan

Contoh bahasa Turki

Amazon Redshift mengembalikan hasil kueri berdasarkan urutan pengurutan UTF-8 biner, bukan urutan pengurutan khusus bahasa. Ini berarti bahwa jika Anda menanyakan tabel Amazon Redshift yang berisi karakter Turki, maka hasil kueri tidak diurutkan menurut urutan linguistik bahasa Turki. Bahasa Turki berisi enam karakter khusus (ç, ı, ğ, ö, ş, dan ü) yang tidak muncul dalam alfabet Latin. Karakter khusus ini ditempatkan di akhir set hasil yang diurutkan berdasarkan urutan UTF-8 biner, seperti yang ditunjukkan tabel berikut.

Pemesanan biner UTF-8

Urutan linguistik Turki

a

a

b

b

c

c

d

ç (*)

e

d

f

e

g

f

-h

g

saya

ğ (*)

j

-h

k

ı (*)

l

saya

m

j

n

k

o

l

p

m

r

n

detik

o

t

ö (*)

u

p

v

r

y

detik

z

ş (*)

ç (*)

t

ğ (*)

u

ı (*)

ü (*)

ö (*)

v

ş (*)

y

ü (*)

z

catatan

Tanda bintang (*) menunjukkan karakter khusus dalam bahasa Turki.

Seperti yang diilustrasikan tabel di atas, karakter khusus ç adalah antara c dan d dalam urutan linguistik Turki, tetapi muncul setelah z dalam urutan UTF-8 biner. UDF Python skalar dalam pola ini menggunakan kamus pengganti karakter berikut untuk menggantikan karakter khusus Turki dengan karakter setara Latin yang sesuai.

Karakter khusus Turki

Karakter yang setara dengan Latin

ç

c ~

ı

h ~

ğ

g ~

ö

o ~

ş

s ~

ü

u ~

catatan

Karakter tilde (~) ditambahkan ke akhir karakter Latin yang menggantikan karakter khusus Turki yang sesuai.

Memodifikasi fungsi UDF Python skalar

Untuk memodifikasi fungsi UDF Python skalar dari pola ini sehingga fungsi menerima parameter locate dan mendukung kamus transaksi ganda, gunakan kode SQL berikut:

CREATE OR REPLACE FUNCTION collate_sort (value varchar, locale varchar) RETURNS varchar IMMUTABLE AS $$ def sort_str(val): import string # Turkish Dictionary if locale == 'tr-TR': dictionary = { 'I': 'ı', 'ı': 'h~', 'İ': 'i', 'Ş': 's~', 'ş': 's~', 'Ğ': 'g~', 'ğ': 'g~', 'Ü': 'u~', 'ü': 'u~', 'Ö': 'o~', 'ö': 'o~', 'Ç': 'c~', 'ç': 'c~' } # German Dictionary if locale == 'de-DE': dictionary = { .... .... } for key, value in dictionary.items(): val = val.replace(key, value) return val.lower() return sort_str(value) $$ LANGUAGE plpythonu;

Kode contoh berikut menunjukkan bagaimana untuk query UDF Python dimodifikasi:

SELECT first_name FROM my_table ORDER BY collate_order(first_name, 'tr-TR');