

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 una UDF escalar de Python
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf"></a>

*Ethan Stark, Amazon Web Services*

## Resumen
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-summary"></a>

Este patrón proporciona los pasos y un código de ejemplo para usar una UDF (función definida por el usuario) de Python escalar para configurar una clasificación lingüística que no distinga entre mayúsculas y minúsculas para los resultados de las consultas de Amazon Redshift. Es necesario utilizar una UDF de Python escalar porque Amazon Redshift devuelve los resultados en función del orden binario de UTF-8 y no admite la clasificación por idiomas específicos. Una UDF de Python es un código de procesamiento que no es de SQL que se basa en un programa de Python y se ejecuta en un almacén de datos. Puede ejecutar código UDF de Python con una instrucción SQL en una sola consulta. Para obtener más información, consulte la entrada del blog [Introducción a Python UDFs en Amazon Redshift](https://aws.amazon.com/blogs/big-data/introduction-to-python-udfs-in-amazon-redshift/) AWS Big Data.

Los datos de muestra de este patrón se basan en el alfabeto turco con fines de demostración. La UDF escalar de Python de este patrón está diseñada 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 la UDF escalar de Python en este patrón para otros lenguajes.

## Requisitos previos y limitaciones
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-prereqs"></a>

**Requisitos previos **
+ [Clúster de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html) con base de datos, esquema y tablas
+ [Usuario de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/r_Users.html) con permisos `CREATE TABLE` y `CREATE FUNCTION`.
+ [Python 2.7](https://www.python.org/download/releases/2.7/) o posterior

**Limitaciones**

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

## Tools (Herramientas)
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-tools"></a>

**Servicios de AWS**
+ [Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html) es un servicio de almacén de datos administrado que opera a escala de petabytes en la Nube de 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**
+ Las [funciones definidas por el usuario de Python (UDFs)](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-introduction.html) son funciones que puede escribir en Python y, a continuación, invocar sentencias SQL.

## Epics
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-epics"></a>

### Desarrolle código para ordenar los resultados de las consultas en orden lingüístico
<a name="develop-code-to-sort-query-results-in-linguistic-order"></a>


| Tarea | Descripción | Habilidades 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:<pre>CREATE TABLE my_table (first_name varchar(30));<br /><br />INSERT INTO my_table (first_name)<br />VALUES<br />    ('ali'),<br />    ('Ali'),<br />    ('ırmak'),<br />    ('IRMAK'),<br />    ('irem'),<br />    ('İREM'),<br />    ('oğuz'),<br />    ('OĞUZ'),<br />    ('ömer'),<br />    ('ÖMER'),<br />    ('sedat'),<br />    ('SEDAT'),<br />    ('şule'),</pre>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:<pre>SELECT first_name FROM my_table ORDER BY first_name;</pre>La consulta devuelve la lista de nombres de la tabla que creó anteriormente:<pre>first_name<br />---------------<br />Ali<br />IRMAK<br />OĞUZ<br />SEDAT<br />ali<br />irem<br />oğuz<br />sedat<br />ÖMER<br />ömer<br />İREM<br />ırmak<br />ŞULE<br />şule</pre>Los resultados de la consulta no están en el orden correcto porque el orden binario predeterminado en UTF-8 no se adapta al orden lingüístico de los caracteres especiales turcos. | Ingeniero de datos | 
| Creación de una UDF de Python escalar. | Para crear una UDF de Python escalar, utilice el siguiente código SQL: <pre>CREATE OR REPLACE FUNCTION collate_sort (value varchar) <br />RETURNS varchar <br />IMMUTABLE <br />AS <br />$$    <br />    def sort_str(val):<br />        import string<br />        <br />        dictionary = {<br />            'I': 'ı', <br />            'ı': 'h~', <br />            'İ': 'i', <br />            'Ş': 's~', <br />            'ş': 's~', <br />            'Ğ': 'g~', <br />            'ğ': 'g~', <br />            'Ü': 'u~', <br />            'ü': 'u~', <br />            'Ö': 'o~', <br />            'ö': 'o~', <br />            'Ç': 'c~', <br />            'ç': 'c~'<br />        }<br />        <br />        for key, value in dictionary.items():<br />            val = val.replace(key, value)<br />        <br />        return val.lower()<br /> <br />    return sort_str(value)<br />    <br />$$ LANGUAGE plpythonu;</pre> | Ingeniero de datos | 
| Consulta del ejemplo de datos. | Para consultar del ejemplo de datos mediante la UDF de Python, ejecute la siguiente consulta SQL:<pre>SELECT first_name FROM my_table ORDER BY collate_sort(first_name);</pre>La consulta ahora devuelve los datos de la muestra en orden lingüístico turco:<pre>first_name<br />---------------<br />ali<br />Ali<br />ırmak<br />IRMAK<br />irem<br />İREM<br />oğuz<br />OĞUZ<br />ömer<br />Ömer<br />sedat<br />SEDAT<br />şule<br />ŞULE</pre> | Ingeniero de datos | 

## Recursos relacionados
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-resources"></a>
+ [Cláusula ORDER BY](https://docs.aws.amazon.com/redshift/latest/dg/r_ORDER_BY_clause.html) (documentación de Amazon Redshift)
+ [Creación de una UDF de Python escalar](https://docs.aws.amazon.com/redshift/latest/dg/udf-creating-a-scalar-udf.html) (documentación de Amazon Redshift)

## Información adicional
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-additional"></a>

**Ejemplo de idioma turco**

Amazon Redshift devuelve los resultados de las consultas en función de la ordenación binaria de UTF-8, no de una ordenación específica 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 en UTF-8 | Ordenamiento lingüístico turco | 
| --- |--- |
| a | a | 
| b | b | 
| c | c | 
| d | **ç (\$1)** | 
| e | d | 
| f | e | 
| g | f | 
| h | g | 
| i | **ğ (\$1)** | 
| j | h | 
| k | **ı (\$1)** | 
| l | i | 
| m | j | 
| n | k | 
| o | l | 
| p | m | 
| r | n | 
| s | o | 
| t | **ö (\$1)** | 
| u | p | 
| v | r | 
| y | s | 
| z | **ş (\$1)** | 
| **ç (\$1)** | t | 
| **ğ (\$1)** | u | 
| **ı (\$1)** | **ü (\$1)** | 
| **ö (\$1)** | v | 
| **ş (\$1)** | y | 
| **ü (\$1)** | z | 

**nota**  
El asterisco (\$1) indica un carácter especial en el idioma turco.

Como se muestra en la tabla anterior, el carácter especial **ç** se encuentra entre la **c** y la **d** en el orden lingüístico turco, pero aparece después de la **z** en el orden binario UTF-8. La UDF de Python escalar de este patrón utiliza 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\$1 | 
| ı | h\$1 | 
| ğ | g\$1 | 
| ö | o\$1 | 
| ş | s\$1 | 
| ü | u\$1 | 

**nota**  
Se agrega un carácter de tilde (\$1) al final de los caracteres latinos que sustituyen a sus correspondientes caracteres especiales turcos.

**Cómo modificar una función UDF de Python escalar**

Para modificar la función UDF de Python escalar 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 código 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;
```

En el siguiente ejemplo de código se muestra cómo se consulta del UDF de Python modificado:

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