Imposta l'ordinamento specifico della lingua per i risultati delle query di Amazon Redshift utilizzando un UDF scalare in Python - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Imposta l'ordinamento specifico della lingua per i risultati delle query di Amazon Redshift utilizzando un UDF scalare in Python

Creato da Ethan Stark (AWS)

Riepilogo

Questo modello fornisce passaggi e codice di esempio per l'utilizzo di un UDF scalare in Python (funzione definita dall'utente) per configurare l'ordinamento linguistico senza distinzione tra maiuscole e minuscole per i risultati delle query di Amazon Redshift. È necessario utilizzare un UDF Python scalare perché Amazon Redshift restituisce risultati basati sull'ordinamento binario UTF-8 e non supporta l'ordinamento specifico della lingua. Un UDF Python è un codice di elaborazione non SQL basato su un programma Python 2.7 ed eseguito in un data warehouse. È possibile eseguire il codice UDF Python con un'istruzione SQL in una singola query. Per ulteriori informazioni, consulta il post del blog Introduzione a Python UDFs in Amazon Redshift AWS Big Data.

I dati di esempio di questo modello si basano sull'alfabeto turco a scopo dimostrativo. L'UDF scalare Python in questo modello è stato creato per rendere i risultati delle query predefiniti di Amazon Redshift conformi all'ordinamento linguistico dei caratteri in lingua turca. Per ulteriori informazioni, consulta l'esempio della lingua turca nella sezione Informazioni aggiuntive di questo modello. È possibile modificare l'UDF scalare di Python in questo modello per altri linguaggi.

Prerequisiti e limitazioni

Prerequisiti

  • Cluster Amazon Redshift con database, schema e tabelle

  • Utente Amazon Redshift con autorizzazioni CREATE TABLE e CREATE FUNCTION

  • Python 2.7 o successivo

Limitazioni

L'ordinamento linguistico utilizzato dalle query in questo modello non fa distinzione tra maiuscole e minuscole.

Architettura

Stack tecnologico

  • Amazon Redshift

  • UDF in Python

Strumenti

Servizi AWS

  • Amazon Redshift è un servizio di data warehouse gestito su scala petabyte nel cloud AWS. Amazon Redshift è integrato con il tuo data lake, il che ti consente di utilizzare i tuoi dati per acquisire nuove informazioni per la tua azienda e i tuoi clienti.

Altri strumenti

Epiche

AttivitàDescrizioneCompetenze richieste

Crea una tabella per i tuoi dati di esempio.

Per creare una tabella in Amazon Redshift e inserire i dati di esempio nella tabella, utilizza le seguenti istruzioni SQL:

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'),
Nota

I primi nomi nei dati di esempio includono caratteri speciali dell'alfabeto turco. Per ulteriori informazioni sulle considerazioni relative alla lingua turca relative a questo esempio, consultate Esempio di lingua turca nella sezione Informazioni aggiuntive di questo modello.

Ingegnere dei dati

Controlla l'ordinamento predefinito dei dati di esempio.

Per visualizzare l'ordinamento predefinito dei dati di esempio in Amazon Redshift, esegui la seguente query:

SELECT first_name FROM my_table ORDER BY first_name;

La query restituisce l'elenco dei nomi dalla tabella creata in precedenza:

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

I risultati della query non sono nell'ordine corretto perché l'ordinamento binario UTF-8 predefinito non supporta l'ordinamento linguistico dei caratteri speciali turchi.

Ingegnere dei dati

Crea una UDF Python scalare.

Per creare una UDF Python scalare, usa il seguente codice SQL: 

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;
Ingegnere dei dati

Interroga i dati di esempio.

Per interrogare i dati di esempio utilizzando Python UDF, esegui la seguente query SQL:

SELECT first_name FROM my_table ORDER BY collate_order(first_name);

La query ora restituisce i dati di esempio in ordine linguistico turco:

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

Risorse correlate

Informazioni aggiuntive

Esempio di lingua turca

Amazon Redshift restituisce i risultati delle query in base all'ordinamento binario UTF-8, non all'ordinamento specifico della lingua. Ciò significa che se esegui una query su una tabella Amazon Redshift contenente caratteri turchi, i risultati della query non vengono ordinati in base all'ordinamento linguistico della lingua turca. La lingua turca contiene sei caratteri speciali (ç, ı, ğ, ö, ş e ü) che non compaiono nell'alfabeto latino. Questi caratteri speciali vengono posizionati alla fine di un set di risultati ordinato in base all'ordinamento binario UTF-8, come illustrato nella tabella seguente.

Ordinamento binario UTF-8

Ordinamento linguistico turco

a

a

b

b

c

c

d

ç (*)

e

d

f

e

g

f

h

g

i

ğ (*)

j

h

k

ı (*)

l

i

m

j

n

k

o

l

p

m

r

n

s

o

t

ö (*)

u

p

v

r

y

s

z

s (*)

c (*)

t

ğ (*)

u

ı (*)

ü (*)

ö (*)

v

s (*)

y

ü (*)

z

Nota

L'asterisco (*) indica un carattere speciale nella lingua turca.

Come illustrato nella tabella precedente, il carattere speciale ç si trova tra c e d nell'ordinamento linguistico turco, ma appare dopo z nell'ordinamento binario UTF-8. L'UDF scalare Python in questo modello utilizza il seguente dizionario di sostituzione dei caratteri per sostituire i caratteri speciali turchi con i corrispondenti caratteri equivalenti al latino.

Carattere speciale turco

Carattere equivalente al latino

ç

c~

ı

h ~

ğ

g ~

ö

o~

ş

s~

ü

u~

Nota

Un carattere tilde (~) viene aggiunto alla fine dei caratteri latini che sostituiscono i corrispondenti caratteri speciali turchi.

Modifica una funzione UDF Python scalare

Per modificare la funzione UDF scalare di Python da questo modello in modo che la funzione accetti un parametro locate e supporti un dizionario di transazioni multiple, usa il seguente codice SQL:

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;

Il codice di esempio seguente mostra come interrogare l'UDF Python modificato:

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