Configure la clasificación por idioma para los resultados de las consultas de Amazon Redshift mediante un Python escalar UDF - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configure la clasificación por idioma para los resultados de las consultas de Amazon Redshift mediante un Python escalar UDF

Creado por Ethan Stark () AWS

Entorno: producción

Tecnologías: Análisis

AWSservicios: Amazon Redshift

Resumen

Este patrón proporciona pasos y código de ejemplo para usar un Python escalar UDF (función definida por el usuario) para configurar una clasificación lingüística que no distinga mayúsculas de minúsculas para los resultados de las consultas de Amazon Redshift. Es necesario utilizar un Python escalar UDF porque Amazon Redshift devuelve los resultados en función del orden UTF binario -8 y no admite la ordenación por idiomas específicos. Un Python UDF es un código sin SQL procesamiento que se basa en un programa Python 2.7 y se ejecuta en un almacén de datos. Puede ejecutar UDF código Python con una SQL sentencia en una sola consulta. Para obtener más información, consulte la entrada del blog Introducción a Python UDFs en Amazon Redshift AWS Big Data.

Los datos de muestra de este patrón se basan en el alfabeto turco con fines de demostración. El Python UDF escalar de este patrón está diseñado para que los resultados de las consultas predeterminados de Amazon Redshift se ajusten al orden lingüístico de los caracteres del idioma turco. Para obtener más información, consulte Ejemplo de lengua turca en la sección Información adicional de este patrón. Puede modificar el Python escalar UDF en este patrón para otros lenguajes.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

La clasificación lingüística utilizada por las consultas en este patrón no distingue entre mayúsculas y minúsculas.

Arquitectura

Pila de tecnología

  • Amazon Redshift

  • Python UDF

Herramientas

AWSservicios

  • Amazon Redshift es un servicio de almacenamiento de datos gestionado a escala de petabytes en la nube. AWS Amazon Redshift está integrado en el lago de datos, lo que permite usar los datos para adquirir nueva información para su empresa y sus clientes.

Otras herramientas

Epics

TareaDescripciónHabilidades requeridas

Cree una tabla para los datos de su muestra.

Para crear una tabla en Amazon Redshift e insertar los datos de muestra en la tabla, utilice las siguientes instrucciones: 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: Los primeros nombres de los datos de muestra incluyen caracteres especiales del alfabeto turco. Para obtener más información sobre las consideraciones relativas al idioma turco en este ejemplo, consulte Ejemplo de lengua turca en la sección Información adicional de este patrón.

Ingeniero de datos

Compruebe la clasificación predeterminada de los datos de la muestra.

Para ver la clasificación predeterminada de los datos de muestra en Amazon Redshift, ejecute la siguiente consulta:

SELECT first_name FROM my_table ORDER BY first_name;

La consulta devuelve la lista de nombres de la tabla que creó anteriormente:

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

Los resultados de la consulta no están en el orden correcto porque el orden binario UTF -8 predeterminado no se adapta al orden lingüístico de los caracteres especiales turcos.

Ingeniero de datos

Crea un Python UDF escalar.

Para crear un Python escalarUDF, usa el siguiente SQL código: 

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;
Ingeniero de datos

Consulta del ejemplo de datos.

Para consultar los datos de ejemplo mediante PythonUDF, ejecute la siguiente SQL consulta:

SELECT first_name FROM my_table ORDER BY collate_order(first_name);

La consulta ahora devuelve los datos de la muestra en orden lingüístico turco:

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

Recursos relacionados

Información adicional

Ejemplo de idioma turco

Amazon Redshift devuelve los resultados de las consultas en función del orden binario UTF -8, no de un orden de clasificación específico del idioma. Esto significa que si consulta una tabla de Amazon Redshift que contenga caracteres turcos, los resultados de la consulta no se ordenarán según el orden lingüístico del idioma turco. El idioma turco contiene seis caracteres especiales (ç, ı, ğ, ö, ş y ü) que no aparecen en el alfabeto latino. Estos caracteres especiales se colocan al final de un conjunto de resultados ordenados según el orden binario UTF -8, como se muestra en la siguiente tabla.

Orden binario UTF -8

Ordenamiento lingüístico 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

ş (*)

ç (*)

t

ğ (*)

u

ı (*)

ü (*)

ö (*)

v

ş (*)

y

ü (*)

z

Nota: El asterisco (*) indica un carácter especial en el idioma turco.

Como se muestra en la tabla anterior, el carácter especial ç se encuentra entre c y d en el orden lingüístico turco, pero aparece después de z en el orden binario UTF -8. El Python UDF escalar de este patrón usa el siguiente diccionario de reemplazo de caracteres para reemplazar los caracteres especiales turcos por los correspondientes caracteres equivalentes en latín.

Carácter especial turco

Carácter equivalente en latín

ç

c~

ı

h~

ğ

g~

ö

o~

ş

s~

ü

u~

Nota: Se añade un carácter de tilde (~) al final de los caracteres latinos que sustituyen a sus correspondientes caracteres especiales turcos.

Modificar una función escalar de Python UDF

Para modificar la UDF función escalar de Python a partir de este patrón para que la función acepte un parámetro de localización y admita un diccionario de transacciones múltiples, utilice el siguiente SQL código:

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;

El siguiente código de ejemplo muestra cómo consultar el Python modificadoUDF:

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