Configure a classificação específica do idioma para os resultados da consulta do Amazon Redshift usando uma UDF escalar do Python - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configure a classificação específica do idioma para os resultados da consulta do Amazon Redshift usando uma UDF escalar do Python

Criado por Ethan Stark (AWS)

Resumo

Esse padrão fornece as etapas e o código de amostra para usar uma UDF escalar do Python (função definida pelo usuário) para configurar a classificação linguística sem distinção entre maiúsculas e minúsculas para os resultados da consulta do Amazon Redshift. É necessário usar uma UDF escalar do Python porque o Amazon Redshift retorna resultados com base na ordenação binária UTF-8 e não é compatível com a classificação específica da linguagem. Uma UDF em Python é um código de processamento não SQL baseado em um programa Python 2.7 e executado em um data warehouse. Você pode executar o código UDF do Python com uma instrução SQL em uma única consulta. Para obter mais informações, consulte a postagem do blog de Big Data da AWS sobre Introdução ao Python UDFs no Amazon Redshift.

Os dados de amostra nesse padrão são baseados no alfabeto turco para fins de demonstração. A UDF escalar do Python nesse padrão foi criada para fazer com que os resultados da consulta padrão do Amazon Redshift estejam em conformidade com a ordem linguística dos caracteres no idioma turco. Para obter mais informações, consulte o Exemplo do idioma turco na seção Informações adicionais desse padrão. Você pode modificar a UDF escalar do Python nesse padrão para outras linguagens.

Pré-requisitos e limitações

Pré-requisitos

  • Cluster do Amazon Redshift com um banco de dados, esquema e tabelas

  • Usuário do Amazon Redshift com permissões CREATE TABLE e CREATE FUNCTION

  • Python 2.7 ou superior

Limitações

A classificação linguística usada pelas consultas nesse padrão não diferencia maiúsculas de minúsculas.

Arquitetura

Pilha de tecnologia

  • Amazon Redshift

  • UDFs do Python

Ferramentas

Serviços da AWS

  • O Amazon Redshift é um serviço de data warehouse em escala de petabytes gerenciado na Nuvem AWS. O Amazon Redshift é integrado ao seu data lake, o que permite que você use seus dados para adquirir novos insights para seus negócios e clientes.

Outras ferramentas

Épicos

TarefaDescriçãoHabilidades necessárias

Crie uma tabela para seus dados de amostra.

Para criar uma tabela no Amazon Redshift e inserir seus dados de amostra na tabela, use as seguintes instruções 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

Os primeiros nomes nos dados da amostra incluem caracteres especiais do alfabeto turco. Para obter mais informações sobre as considerações sobre o idioma turco neste exemplo, consulte Exemplo do idioma turco na seção Informações adicionais desse padrão.

Engenheiro de dados

Verifique a classificação padrão dos dados da amostra.

Para ver a classificação padrão dos seus dados de amostra no Amazon Redshift, execute a seguinte consulta:

SELECT first_name FROM my_table ORDER BY first_name;

A consulta retorna a lista de nomes próprios da tabela que você criou anteriormente:

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

Os resultados da consulta não estão na ordem correta porque a ordem padrão do binário UTF-8 não acomoda a ordem linguística dos caracteres especiais turcos.

Engenheiro de dados

Crie uma UDF escalar em Python

Para criar uma UDF escalar em Python, use o seguinte código 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;
Engenheiro de dados

Consulte os dados de amostra.

Para consultar os dados de amostra usando as UDFs do Python, execute esta consulta SQL:

SELECT first_name FROM my_table ORDER BY collate_order(first_name);

A consulta agora retorna os dados de amostra em ordem linguística turca:

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

Recursos relacionados

Mais informações

Exemplo de idioma turco

O Amazon Redshift retorna os resultados da consulta com base na ordem de classificação binária UTF-8, não na ordem de classificação específica do idioma. Isso significa que se você consultar uma tabela do Amazon Redshift contendo caracteres turcos, os resultados da consulta não serão classificados de acordo com a ordem linguística do idioma turco. O idioma turco contém seis caracteres especiais (ç, ı, ğ, ö, ş e ü) que não existem no alfabeto latino. Esses caracteres especiais são colocados no final de um conjunto de resultados ordenado com base na ordem binária UTF-8, conforme mostra a tabela a seguir.

Ordenação binária UTF-8

Ordenação linguística turca

a

a

b

b

c

c

d

ç (*)

p

d

f

p

g

f

h

g

i

ğ (*)

j

h

k

i (*)

l

i

m

j

n

k

o

l

p

m

r

n

s

o

t

ö (*)

u

p

v

r

y

s

z

ş (*)

ç (*)

t

ğ (*)

u

i (*)

ü (*)

ö (*)

v

ş (*)

y

ü (*)

z

nota

O asterisco (*) indica um caractere especial no idioma turco.

Como ilustra a tabela acima, o caractere especial ç está entre c e d na ordenação linguística turca, mas aparece depois de z na ordem binária UTF-8. A UDF escalar no Python nesse padrão usa o seguinte dicionário de substituição de caracteres para substituir os caracteres especiais turcos pelos caracteres correspondentes equivalentes ao latim.

Caractere especial turco

Caractere equivalente em latim

ç

c~

ı

h~

ğ

g~

ö

o~

ş

s~

ü

u~

nota

Um caractere tilde (~) é anexado ao final dos caracteres latinos que substituem os caracteres especiais turcos correspondentes.

Modifique uma função UDF escalar do Python

Para modificar a função UDF escalar do Python a partir desse padrão para que a função aceite um parâmetro localizar e ofereça suporte a um dicionário de várias transações, use o seguinte 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;

O código de exemplo a seguir mostra como consultar a UDFs do Python modificada:

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