

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# スカラー Python UDF を使用した Amazon Redshift クエリー結果の言語固有のソートの設定
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf"></a>

*Ethan Stark、Amazon Web Services*

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

このパターンは、スカラーの Python UDF (ユーザー定義関数) を使用した Amazon Redshift のクエリ結果について、大文字と小文字を区別しない言語ソートを設定する手順とサンプルコードを提供します。Amazon Redshift はバイナリ UTF-8 ソートに基づいて結果を返し、言語固有のソートをサポートしていないので、スカラー Python UDF を使用する必要があります。Python UDF は Python プログラム基づいた SQL 以外の処理コードで、データウェアハウス内で実行されます。1 つのクエリで SQL ステートメントを使用して Python UDF コードを実行できます。詳細については、[Amazon Redshift ビッグデータブログ記事のUDFs の概要](https://aws.amazon.com/blogs/big-data/introduction-to-python-udfs-in-amazon-redshift/) AWS 」を参照してください。

このパターンのサンプルデータは、デモ用にトルコ語のアルファベットに基づいています。このパターンのスカラー Python UDF は、Amazon Redshift のデフォルトのクエリ結果をトルコ語の文字の言語順序に合うように構築されています。詳細については、このパターンの「*追加情報*」セクションにある*トルコ語の例*を参照してください。このパターンのスカラー Python UDF を他の言語に変更できます。

## 前提条件と制限事項
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-prereqs"></a>

**前提条件**
+ データベース、スキーマ、テーブルを含む [Amazon Redshift クラスター](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html) 
+ `CREATE TABLE` および `CREATE FUNCTION` アクセス許可を持つ [Amazon Redshift ユーザー](https://docs.aws.amazon.com/redshift/latest/dg/r_Users.html) 
+ [Python 2.7](https://www.python.org/download/releases/2.7/) 以降

**機能制限**

このパターンのクエリで使用される言語ソートでは、大文字と小文字は区別しません。

## ツール
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-tools"></a>

**AWS のサービス**
+ [Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html) は、 AWS クラウド内でのフルマネージド型、ペタバイト規模のデータウェアハウスサービスです。Amazon Redshift はデータレイクと統合されているため、データを使用して、ビジネスと顧客に関する新しいインサイトを得られます。

**その他のツール**
+ [Python (UDF) ユーザー定義関数](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-introduction.html) は、Python で記述し、SQL ステートメントで呼び出すことができる関数です。

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

### クエリ結果を言語順にソートするコードの開発
<a name="develop-code-to-sort-query-results-in-linguistic-order"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| サンプルデータ用のテーブルを作成します。 | Amazon Redshift でテーブルを作成し、次の 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>サンプルデータのファーストネームには、トルコ語アルファベットの特殊文字が含まれます。この例のトルコ語の考慮事項については、このパターンの「*追加情報*」セクションにある「*トルコ語の例*」を参照してください。 | データエンジニア | 
| サンプルデータのデフォルトソートを確認します。 | Amazon Redshift のサンプルデータのデフォルトソートを確認するには、次のクエリを実行します。<pre>SELECT first_name FROM my_table ORDER BY first_name;</pre>このクエリは、以前に作成したテーブルからファーストネームのリストを返します。<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>デフォルトのバイナリ UTF-8 の順序がトルコ語の特殊文字の言語順序に対応していないため、クエリ結果の順序が正しくありません。 | データエンジニア | 
| スカラー Python UDF の作成 | スカラー Python UDF を作成するには、次の 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> | データエンジニア | 
| サンプルデータをクエリします。　 | Python UDF を使用してサンプルデータをクエリするには、次の SQL クエリーを実行します：<pre>SELECT first_name FROM my_table ORDER BY collate_sort(first_name);</pre>これで、クエリはトルコ語の順序でサンプルデータを返すようになりました。<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> | データエンジニア | 

## 関連リソース
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-resources"></a>
+ [「注文条件」](https://docs.aws.amazon.com/redshift/latest/dg/r_ORDER_BY_clause.html) (Amazon Redshift ドキュメント)
+ [「スカラー Python UDF の作成」](https://docs.aws.amazon.com/redshift/latest/dg/udf-creating-a-scalar-udf.html) (Amazon Redshift ドキュメント)

## 追加情報
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-additional"></a>

**トルコ語の例**

Amazon Redshift は、言語固有のソート順序ではなく、バイナリ UTF-8 の順序に基づいてクエリ結果を返します。つまり、トルコ語の文字を含む Amazon Redshift テーブルに対してクエリを実行した場合、クエリ結果はトルコ語の言語順でソートされません。トルコ語には、ラテン文字にはない 6 つの特殊文字 (、ı、、ö、ü) が含まれています。これらの特殊文字は、次のテーブルに示すように、UTF-8 バイナリの順序に基づいてソートされた結果セットの最後に配置されます。


| 
| 
| UTF-8 バイナリの順序 | トルコ語の順序付け | 
| --- |--- |
| ある | ある | 
| b | b | 
| c | c | 
| d | **çe (\$1)** | 
| e | d | 
| f | e | 
| g | f | 
| h | g | 
| i | **ğ (\$1)** | 
| j | h | 
| k | **ı (\$1)** | 
| I | i | 
| m | j | 
| n | k | 
| o | I | 
| p | m | 
| r | n | 
| s | o | 
| t | **ö (\$1)** | 
| u | p | 
| v | r | 
| y | s | 
| z | **ş (\$1)** | 
| **çe (\$1)** | t | 
| **ğ (\$1)** | u | 
| **ı (\$1)** | **ü (\$1)** | 
| **ö (\$1)** | v | 
| **ş (\$1)** | y | 
| **ü (\$1)** | z | 

**注記**  
アスタリスク (\$1) はトルコ語の特殊文字を示します。

上の表が示すように、特殊文字 **ç** はトルコ語の順序では **c** と **d **の間ですが、UTF-8 バイナリの順序では **z** の後に表示されます。このモードのスカラー Python UDF は、トルコ語の特殊文字をラテン語の対応する文字に置き換えるために、次の文字置換辞書を使用します。


| 
| 
| トルコ語の特殊文字 | ラテン語に相当する文字 | 
| --- |--- |
| ç | c\$1 | 
| ı | h\$1 | 
| ğ | g\$1 | 
| ö | o\$1 | 
| ş | s\$1 | 
| ü | u\$1 | 

**注記**  
トルコ語の特殊文字を置換するラテン文字の末尾には、チルダ (\$1) 文字が追加されます。

**スカラー Python UDF 関数を変更する**

スカラー Python UDF 関数が locate パラメータを受け入れ、マルチトランザクション辞書をサポートするように、このスキーマに基づいて変更するには、次の 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;
```

次のコード例では、変更された Python UDF をクエリする方法を示しています。

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