

# Amazon Ion Hive SerDe
<a name="ion-serde"></a>

Amazon Ion Hive SerDe を使用すると、[Amazon Ion](https://amzn.github.io/ion-docs/guides/cookbook.html) 形式で保存されているデータをクエリできます。Amazon Ion は、リッチタイプで自己記述型のオープンソースのデータ形式です。Amazon Ion 形式は、オープンソースの SQL クエリ言語である [PartiQL](https://partiql.org/) で使用されています。

Amazon Ion には、交換可能なバイナリ形式とテキスト形式があります。この機能は、テキストの使いやすさとバイナリエンコードの効率性を兼ね備えています。

Athena から Amazon Ion データをクエリするには、[Amazon Ion Hive SerDe](https://github.com/amzn/ion-hive-serde) を使用できます。これにより、Amazon Ion データがシリアル化および逆シリアル化されます。逆シリアル化では、Amazon Ion データをクエリしたり、データを読み取って Parquet や ORC など別の形式に書き出したりできます。シリアル化では、`CREATE TABLE AS SELECT` (CTAS) や `INSERT INTO` クエリを使用して既存のテーブルからデータをコピーすることで、Amazon Ion 形式のデータを生成できます。

**注記**  
Amazon Ion は JSON のスーパーセットであるため、Amazon Ion Hive SerDe を使用して Amazon Ion 以外の JSON データセットをクエリできます。他の [JSON SerDe ライブラリ](https://docs.aws.amazon.com/athena/latest/ug/json-serde.html)とは異なり、Amazon Ion SerDe ではデータの各行が 1 行にあるとは想定していません。この機能は、「プリティ印刷」形式の JSON データセットをクエリする場合や、改行文字で行のフィールドを分割する場合に便利です。

Athena で Amazon Ion をクエリする方法の追加情報および例については、「[Analyze Amazon Ion datasets using Amazon Athena](https://aws.amazon.com/blogs/big-data/analyze-amazon-ion-datasets-using-amazon-athena/)」を参照してください。

## シリアル化ライブラリ名
<a name="library-name"></a>

Amazon Ion SerDe のシリアル化ライブラリ名は `com.amazon.ionhiveserde.IonHiveSerDe` です。ソースコード情報については、GitHub.com の「[Amazon Ion Hive SerDe](https://github.com/amazon-ion/ion-hive-serde)」を参照してください。

## 考慮事項と制限事項
<a name="ion-serde-considerations-and-limitations"></a>
+ **重複フィールド** – Amazon Ion 構造体は順序付けされ、重複フィールドに対応していますが、Hive の `STRUCT<>` と `MAP<>` はそうではありません。そのため、Amazon Ion 構造体から重複フィールドを逆シリアル化すると、ある 1 つの値が非決定的に選択され、それ以外の値は無視されます。
+ **外部シンボルテーブルはサポート対象外** – 現時点で、Athena は外部シンボルテーブルや以下の Amazon Ion Hive SerDe プロパティをサポートしていません。
  + `ion.catalog.class`
  + `ion.catalog.file`
  + `ion.catalog.url`
  + `ion.symbol_table_imports`
+ **ファイル拡張子** – Amazon Ion は、ファイル拡張子に基づいて、Amazon Ion ファイルの逆シリアル化に使用する圧縮コーデックを決定します。そのため、圧縮ファイルのファイル拡張子は、使用する圧縮アルゴリズムに対応したものである必要があります。例えば、ZSTD を使用する場合、対応するファイルの拡張子は `.zst` である必要があります。
+ **同種データ** – Amazon Ion では、特定のフィールドの値に使用できるデータ型に制限がありません。例えば、2 つの異なる Amazon Ion ドキュメントに同じ名前のフィールドがある場合、それぞれのフィールドに異なるデータ型を使用できます。ただし、Hive はスキーマを使用するため、1 つの Hive 列に抽出する値はすべて同じデータ型にする必要があります。
+ **マップキーのタイプの制限** – 別の形式のデータを Amazon Ion にシリアル化する場合は、マップキーのタイプを `STRING`、`VARCHAR`、`CHAR` のいずれかにします。Hive では任意のプリミティブデータ型をマップキーとして使用できますが、[Amazon Ion のシンボル](https://amzn.github.io/ion-docs/docs/symbols.html)は文字列型にする必要があります。
+ **共用体型** – Athena は、現時点では Hive [共用体型](https://cwiki.apache.org/confluence/display/hive/languagemanual+types/#LanguageManualTypes-UnionTypesunionUnionTypes)をサポートしていません。
+ **倍精度浮動小数点データ型** — Amazon Ion は現在、`double` データ型をサポートしていません。

**Topics**
+ [シリアル化ライブラリ名](#library-name)
+ [考慮事項と制限事項](#ion-serde-considerations-and-limitations)
+ [Amazon Ion テーブルを作成する](ion-serde-using-create-table.md)
+ [CTAS と INSERT INTO を使用して Amazon Ion テーブルを作成する](ion-serde-using-ctas-and-insert-into-to-create-ion-tables.md)
+ [Amazon Ion SerDe プロパティリファレンス](ion-serde-using-ion-serde-properties.md)
+ [パスエクストラクターを使用する](ion-serde-using-path-extractors.md)

# Amazon Ion テーブルを作成する
<a name="ion-serde-using-create-table"></a>

Amazon Ion 形式で格納されたデータから Athena でテーブルを作成するには、CREATE TABLE ステートメントで次のいずれかの方法を使用します。
+ `STORED AS ION` を指定します。この方法では、Amazon Ion Hive SerDe を明示的に指定する必要はありません。このオプションの方が簡単です。
+ `ROW FORMAT SERDE`、`INPUTFORMAT`、および `OUTPUTFORMAT` の各フィールドで Amazon Ion のクラスパスを指定します。

また、`CREATE TABLE AS SELECT` (CTAS) ステートメントを使用して、Athena で Amazon Ion テーブルを作成することもできます。詳細については、「[CTAS と INSERT INTO を使用して Amazon Ion テーブルを作成する](ion-serde-using-ctas-and-insert-into-to-create-ion-tables.md)」を参照してください。

## STORED AS ION を指定する
<a name="ion-serde-specifying-stored-as-ion"></a>

次の例の `CREATE TABLE` ステートメントでは、`LOCATION` 句の前で `STORED AS ION` を使用し、Amazon Ion 形式でフライトデータに基づいたテーブルを作成しています。`LOCATION` 句では、Ion 形式の入力ファイルが置かれているバケットまたはフォルダを指定します。指定した場所にあるすべてのファイルをスキャンします。

```
CREATE EXTERNAL TABLE flights_ion (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
)
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/'
```

## Amazon Ion クラスパスを指定する
<a name="ion-serde-specifying-the-ion-class-paths"></a>

`STORED AS ION` 構文を使用する代わりに、次のように `ROW FORMAT SERDE`、`INPUTFORMAT`、および `OUTPUTFORMAT` 句に Ion クラスパスの値を明示的に指定することができます。


****  

| パラメータ | Ion クラスパス | 
| --- | --- | 
| ROW FORMAT SERDE | 'com.amazon.ionhiveserde.IonHiveSerDe' | 
| STORED AS INPUTFORMAT | 'com.amazon.ionhiveserde.formats.IonInputFormat' | 
| OUTPUTFORMAT | 'com.amazon.ionhiveserde.formats.IonOutputFormat' | 

次の DDL クエリでは、この手法を使用して、前の例と同じ外部テーブルを作成しています。

```
CREATE EXTERNAL TABLE flights_ion (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
)
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
STORED AS INPUTFORMAT
 'com.amazon.ionhiveserde.formats.IonInputFormat'
OUTPUTFORMAT
 'com.amazon.ionhiveserde.formats.IonOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/'
```

Athena の `CREATE TABLE` ステートメントの SerDe プロパティの詳細については、「[Amazon Ion SerDe プロパティリファレンス](ion-serde-using-ion-serde-properties.md)」を参照してください。

# CTAS と INSERT INTO を使用して Amazon Ion テーブルを作成する
<a name="ion-serde-using-ctas-and-insert-into-to-create-ion-tables"></a>

Athena では、`CREATE TABLE AS SELECT` (CTAS) と `INSERT INTO` ステートメントを使用して、テーブルのデータを Amazon Ion 形式で新しいテーブルにコピーまたは挿入できます。

CTAS クエリでは、次の例のように、`WITH` 句に `format='ION'` を指定します。

```
CREATE TABLE new_table
WITH (format='ION')
AS SELECT * from existing_table
```

デフォルトでは、Athena は Amazon Ion の結果を [Ion バイナリ形式](https://amzn.github.io/ion-docs/docs/binary.html)でシリアル化しますが、テキスト形式を使用することもできます。テキスト形式を使用するには、次の例のように、CTAS `WITH` 句に `ion_encoding = 'TEXT'` を指定します。

```
CREATE TABLE new_table
WITH (format='ION', ion_encoding = 'TEXT')
AS SELECT * from existing_table
```

CTAS `WITH` 句の Amazon Ion 固有のプロパティの詳細については、「[CTAS WITH 句の Amazon Ion プロパティ](#ion-serde-ctas-with-clause-properties)」を参照してください。

## CTAS WITH 句の Amazon Ion プロパティ
<a name="ion-serde-ctas-with-clause-properties"></a>

CTAS クエリで `WITH` 句を使用すると、Amazon Ion 形式を指定できるほか、必要に応じて Amazon Ion エンコードを指定したり、使用する圧縮アルゴリズムを記述したりできます。

**format**  
CTAS クエリの `WITH` 句では、形式オプションとして `ION` キーワードを指定できます。このようにしてテーブルを作成すると、`IonInputFormat` に指定した形式でデータが読み取られ、`IonOutputFormat` に指定した形式でデータがシリアル化されます。  
次の例では、CTAS クエリで Amazon Ion 形式を使用するように指定しています。  

```
WITH (format='ION')
```

**ion\$1encoding**  
オプションです。  
デフォルト: `BINARY`  
値: `BINARY`、`TEXT`  
Amazon Ion バイナリ形式と Amazon Ion テキスト形式のどちらでデータをシリアル化するかを指定します。次の例では、Amazon Ion テキスト形式を指定しています。  

```
WITH (format='ION', ion_encoding='TEXT')
```

**write\$1compression**  
オプションです。  
デフォルト: `GZIP`  
値: `GZIP`、`ZSTD`、`BZIP2`、`SNAPPY`、`NONE`  
出力ファイルの圧縮に使用する圧縮アルゴリズムを指定します。  
次の例では、[Zstandard](https://facebook.github.io/zstd/) 圧縮アルゴリズムを使用して CTAS クエリの出力を Amazon Ion 形式で生成するように指定しています。  

```
WITH (format='ION', write_compression = 'ZSTD')       
```
Athena での圧縮の使用の詳細については、「[Athena で圧縮を使用する](compression-formats.md)」を参照してください。

Athena のその他の CTAS プロパティについては、「[CTAS テーブルのプロパティ](create-table-as.md#ctas-table-properties)」を参照してください。

# Amazon Ion SerDe プロパティリファレンス
<a name="ion-serde-using-ion-serde-properties"></a>

このトピックでは、Athena の `CREATE TABLE` ステートメントに使用できる SerDe プロパティについて説明します。Amazon Ion SerDe プロパティの使用方法の詳細と例については、[GitHub](https://github.com/amzn/ion-hive-serde/tree/master/docs) にある Amazon Ion Hive SerDe ドキュメントの「[SerDe properties](https://github.com/amzn/ion-hive-serde/blob/master/docs/serde-properties.md)」(SerDe プロパティ) を参照してください。

## Amazon Ion SerDe プロパティを指定する方法
<a name="ion-serde-specifying-ion-serde-properties"></a>

`CREATE TABLE` ステートメントで Amazon Ion Hive SerDe のプロパティを指定するには、`WITH SERDEPROPERTIES` 句を使用します。`WITH SERDEPROPERTIES` が `ROW FORMAT SERDE` 句のサブフィールドであるため、次の構文に示すように、まず `ROW FORMAT SERDE` と Amazon Ion Hive SerDe クラスパスを指定する必要があります。

```
...
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
WITH SERDEPROPERTIES (
 'property' = 'value',
 'property' = 'value',
...
)
```

ただし、`WITH SERDEPROPERTIES` を使用する場合には `ROW FORMAT SERDE` 句が必須ですが、`STORED AS ION` か、または長めの `INPUTFORMAT` と `OUTPUTFORMAT` Amazon Ion 構文を使用して Amazon Ion 形式を指定できます。

## Amazon Ion SerDe プロパティ
<a name="ion-serde-ion-serde-properties"></a>

Athena の `CREATE TABLE` ステートメントに使用できる Amazon Ion SerDe プロパティは次のとおりです。

**ion.encoding**  
オプションです。  
デフォルト: `BINARY`  
値: `BINARY`、`TEXT`  
このプロパティは、追加された新しい値が [Amazon Ion バイナリ](https://amzn.github.io/ion-docs/docs/binary.html)と Amazon Ion テキストのどちらの形式としてシリアル化されるかを宣言します。  
次の SerDe プロパティの例では、Amazon Ion テキスト形式を指定しています。  

```
'ion.encoding' = 'TEXT'
```

**ion.fail\$1on\$1overflow**  
オプションです。  
デフォルト: `true`  
値: `true`、`false`  
Amazon Ion では任意の大きな数値型が許可されますが、Hive では許可されません。デフォルトでは、Amazon Ion の値が Hive 列に収まらないと SerDe が失敗しますが、`fail_on_overflow` 設定オプションを使用すると、失敗ではなく値をオーバーフローさせることができます。  
このプロパティは、テーブルレベルまたは列レベルで設定できます。テーブルレベルで指定するには、以下の例のように `ion.fail_on_overflow` を指定します。これにより、すべての列にデフォルトの動作が設定されます。  

```
'ion.fail_on_overflow' = 'true'
```
特定の列を制御するには、次の例のように、`ion` と `fail_on_overflow` の間に列名をピリオドで区切って指定します。  

```
'ion.<column>.fail_on_overflow' = 'false'
```

**ion.path\$1extractor.case\$1sensitive**  
オプションです。  
デフォルト: `false`  
値: `true`、`false`  
Amazon Ion フィールド名の大文字と小文字を区別するかどうかを指定します。`false` の場合、SerDe は Amazon Ion フィールド名を解析するときに大文字と小文字を区別しません。  
例えば、Hive テーブルスキーマに `alias` フィールドを小文字で定義し、Amazon Ion ドキュメントに `alias` フィールドと `ALIAS` フィールドの両方を設定できます。以下に例を示します。  

```
-- Hive Table Schema
alias: STRING

-- Amazon Ion Document
{ 'ALIAS': 'value1'} 
{ 'alias': 'value2'}
```
次の例は、大文字と小文字の区別が `false` に設定されている場合に抽出されるテーブルと、SerDe プロパティを示しています。  

```
-- Serde properties
'ion.alias.path_extractor' = '(alias)'
'ion.path_extractor.case_sensitive' = 'false'

--Extracted Table
| alias    |
|----------|
| "value1" |
| "value2" |
```
次の例は、大文字と小文字の区別が `true` に設定されている場合に抽出されるテーブルと、SerDe プロパティを示しています。  

```
-- Serde properties
'ion.alias.path_extractor' = '(alias)'
'ion.path_extractor.case_sensitive' = 'true'

--Extracted Table
| alias    |
|----------|
| "value2" |
```
2 番目のケースでは、大文字と小文字の区別が `true` に設定され、パスエクストラクタが `alias` に指定されている場合、`ALIAS` フィールドの `value1` は無視されます。

**ion.*<column>*.path\$1extractor**  
オプションです。  
デフォルト: NA  
値: 検索パスを含む文字列  
指定された列の指定された検索パスが含まれるパスエクストラクタを作成します。パスエクストラクタは、Amazon Ion フィールドを Hive 列にマッピングします。パスエクストラクタを指定しないと、Athena は列名に基づいて実行時に動的にパスエクストラクタを作成します。  
次の例のパスエクストラクタは、`example_ion_field` を `example_hive_column` にマッピングしています。  

```
'ion.example_hive_column.path_extractor' = '(example_ion_field)'
```
パスエクストラクタと検索パスの詳細については、「[パスエクストラクターを使用する](ion-serde-using-path-extractors.md)」を参照してください。

**ion.timestamp.serialization\$1offset**  
オプションです。  
デフォルト: `'Z'`  
値: `OFFSET`。`OFFSET ` は `<signal>hh:mm` として表される。値の例: `01:00`、`+01:00`、`-09:30`、`Z` (UTC、00:00 と同じ)  
Apache Hive の[タイムスタンプ](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-timestamp)は、タイムゾーンが組み込まれておらず、UNIX エポックからのオフセットとして保存されます。一方、Amazon Ion のタイムスタンプにはオフセットがあります。このプロパティを使用して、Amazon Ion にシリアル化するときのオフセットを指定します。  
次の例では、1 時間のオフセットを追加しています。  

```
'ion.timestamp.serialization_offset' = '+01:00'       
```

**ion.serialize\$1null**  
オプションです。  
デフォルト: `OMIT`  
値: `OMIT`、`UNTYPED`、`TYPED`  
Amazon Ion SerDe は、Null 値が含まれる列をシリアル化または省略するように設定できます。厳密に型指定された null (`TYPED`) を書き出すことも、型指定されていない null (`UNTYPED`) を書き出すこともできます。厳密に型指定された null は、デフォルトの Amazon Ion から Hive への型マッピングに基づいて決定されます。  
次の例では、厳密に型指定された null を指定しています。  

```
'ion.serialize_null'='TYPED'
```

**ion.ignore\$1malformed**  
オプションです。  
デフォルト: `false`  
値: `true`、`false`  
`true` の場合、SerDe で読み取れない誤った形式があれば、該当するエントリまたはファイル全体が無視されます。詳細については、GitHub にあるドキュメントの「[Ignore malformed](https://github.com/amzn/ion-hive-serde/blob/master/docs/serde-properties.md#ignore-malformed)」(誤った形式を無視する) を参照してください。

**ion.*<column>*.serialize\$1as**  
オプションです。  
デフォルト: 列のデフォルトの型。  
値: Amazon Ion の型を含む文字列  
値をシリアル化する Amazon Ion データ型を決定します。Amazon Ion 型と Hive 型が必ずしも直接マッピングされるわけではないため、Hive 型の中にはシリアル化できる有効なデータ型を複数含むものもあります。データをデフォルト以外のデータ型としてシリアル化するには、このプロパティを使用します。マッピングの詳細については、GitHub にある Amazon Ion の「[型マッピング](https://github.com/amzn/ion-hive-serde/blob/master/docs/type-mapping.md)」ページを参照してください。  
バイナリ Hive 列は、デフォルトでは Amazon Ion BLOB としてシリアル化されますが、[Amazon Ion CLOB](https://amzn.github.io/ion-docs/docs/stringclob.html#ion-clob) (キャラクタラージオブジェクト) としてシリアル化することもできます。次の例では、`example_hive_binary_column` 列を CLOB としてシリアル化しています。  

```
'ion.example_hive_binary_column.serialize_as' = 'clob'       
```

# パスエクストラクターを使用する
<a name="ion-serde-using-path-extractors"></a>

Amazon Ion はドキュメントスタイルのファイル形式ですが、Apache Hive はフラットな列指向形式です。`path extractors` という特別な Amazon Ion SerDe プロパティを使用して、この 2 つの形式をマッピングすることができます。パスエクストラクタは、階層的な Amazon Ion 形式をフラット化し、Amazon Ion の値を Hive 列にマッピングします。また、これを使用して、フィールドの名前を変更することもできます。

このエクストラクタは Athena で生成できますが、必要に応じて独自のエクストラクタを定義することもできます。

**Topics**
+ [Athena 生成パスエクストラクターを使用する](ion-serde-generated-path-extractors.md)
+ [独自のパスエクストラクターを指定する](ion-serde-specifying-your-own-path-extractors.md)
+ [パスエクストラクターで検索パスを使用する](ion-serde-using-search-paths-in-path-extractors.md)
+ [パスエクストラクターの例](ion-serde-examples.md)

# Athena 生成パスエクストラクターを使用する
<a name="ion-serde-generated-path-extractors"></a>

デフォルトでは、Athena は、Hive の列名と一致する最上位レベルの Amazon Ion 値を検索し、それらの一致する値に基づいてランタイムにパスエクストラクタを作成します。Amazon Ion のデータ形式が Hive テーブルスキーマと一致する場合、Athena は動的にエクストラクタを生成します。したがって、それ以上パスエクストラクタを追加する必要はありません。このデフォルトのパスエクストラクタは、テーブルメタデータには保存されません。

次の例は、Athena が列名に基づいてエクストラクタを生成する方法を示しています。

```
-- Example Amazon Ion Document
{
    identification: {
        name: "John Smith",
        driver_license: "XXXX"
    },
    
    alias: "Johnny"    
}

-- Example DDL
CREATE EXTERNAL TABLE example_schema2 (
    identification MAP<STRING, STRING>,
    alias STRING
)
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/path_extraction1/'
```

次に示すのは、Athena によって生成されるエクストラクタの例です。最初のエクストラクタで `identification` フィールドを `identification` 列に抽出し、次のエクストラクタで `alias` フィールドを `alias` 列に抽出しています。

```
'ion.identification.path_extractor' = '(identification)'
'ion.alias.path_extractor' = '(alias)'
```

次の例は、抽出されたテーブルを示しています。

```
|                  identification                    |  alias   |
|----------------------------------------------------|----------|
|{["name", "driver_license"],["John Smith", "XXXX"]} | "Johnny" |
```

# 独自のパスエクストラクターを指定する
<a name="ion-serde-specifying-your-own-path-extractors"></a>

Amazon Ion フィールドが適切に Hive 列にマッピングされない場合は、独自のパスエクストラクタを指定することができます。`CREATE TABLE` ステートメントの `WITH SERDEPROPERTIES` 句で、次の構文を使用します。

```
WITH SERDEPROPERTIES (
   "ion.path_extractor.case_sensitive" = "<Boolean>", 
   "ion.<column_name>.path_extractor" = "<path_extractor_expression>"
)
```

**注記**  
デフォルトでは、パスエクストラクタで大文字と小文字は区別されません。この設定を上書きするには、[ion.path_extractor.case_sensitive](ion-serde-using-ion-serde-properties.md#ioncase) SerDe プロパティを `true` に設定します。

# パスエクストラクターで検索パスを使用する
<a name="ion-serde-using-search-paths-in-path-extractors"></a>

パスエクストラクタの SerDe プロパティの構文には *<path\$1extractor\$1expression>* が含まれています。

```
"ion.<column_name>.path_extractor" = "<path_extractor_expression>"         
```

*<path\$1extractor\$1expression>* を使用し、Amazon Ion ドキュメントを解析して一致するデータを検索する検索パスを指定することができます。検索パスは括弧で囲み、次のコンポーネントをスペースで区切って 1 つ以上含めることができます。
+ **ワイルドカード** — すべての値と一致します。
+ **インデックス** — 指定された数値インデックスの値と一致します。インデックスは 0 から始まります。
+ **テキスト** – 指定したテキストと同等のフィールド名を持つすべての値と一致します。
+ **注釈** — 注釈が指定されているラップされたパスコンポーネントで指定された値と一致します。

次に示すのは、Amazon Ion ドキュメントと検索パスの例です。

```
-- Amazon Ion document
{
    foo: ["foo1", "foo2"] ,
    bar: "myBarValue", 
    bar: A::"annotatedValue"
}

-- Example search paths
(foo 0)       # matches "foo1"
(1)           # matches "myBarValue"
(*)           # matches ["foo1", "foo2"], "myBarValue" and A::"annotatedValue"
()            # matches {foo: ["foo1", "foo2"] , bar: "myBarValue", bar: A::"annotatedValue"}
(bar)         # matches "myBarValue" and A::"annotatedValue"
(A::bar)      # matches A::"annotatedValue"
```

# パスエクストラクターの例
<a name="ion-serde-examples"></a>

次のパスエクストラクターの例は、フィールドをフラット化して名前を変更する方法、またはデータを Amazon Ion テキストとして抽出する方法を示しています。

## フィールドをフラット化して、名前を変更する
<a name="ion-serde-flattening-and-renaming-fields"></a>

次の例は、フィールドをフラット化して名前を変更する検索パスのセットを示しています。この例では、検索パスを使用して次の処理を実行します。
+ `nickname` 列を `alias` フィールドにマッピングします。
+ `identification` 構造体にある `name` サブフィールドに `name` 列をマッピングします。

次に、Amazon Ion ドキュメントの例を示します。

```
-- Example Amazon Ion Document
{
    identification: {
        name: "John Smith",
        driver_license: "XXXX"
    },
    
    alias: "Johnny"    
}
```

次に、パスエクストラクタを定義する `CREATE TABLE` ステートメントの例を示します。

```
-- Example DDL Query
CREATE EXTERNAL TABLE example_schema2 (
    name STRING,
    nickname STRING
)
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
WITH SERDEPROPERTIES (
 'ion.nickname.path_extractor' = '(alias)',
 'ion.name.path_extractor' = '(identification name)'
 )
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/path_extraction2/'
```

次の例は、抽出されたデータを示しています。

```
-- Extracted Table
| name         |   nickname   |
|--------------|--------------|
| "John Smith" |  "Johnny"    |
```

検索パスの詳細、および検索パスのその他の例については、GitHub の「[ion-java-path-extraction](https://github.com/amzn/ion-java-path-extraction)」(Ion Java パス抽出) ページを参照してください。

## フライトデータをテキスト形式で抽出する
<a name="ion-serde-extracting-flight-data-to-text-format"></a>

次の例の `CREATE TABLE` クエリでは、`WITH SERDEPROPERTIES` を使用してパスエクストラクタを追加し、フライトデータを抽出して、出力エンコードを Amazon Ion テキストに指定しています。この例では `STORED AS ION` 構文を使用しています。

```
CREATE EXTERNAL TABLE flights_ion (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
)
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
WITH SERDEPROPERTIES (
 'ion.encoding' = 'TEXT',
 'ion.yr.path_extractor'='(year)',
 'ion.quarter.path_extractor'='(results quarter)',
 'ion.month.path_extractor'='(date month)')
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/'
```