

# AWS Glue で Avro 形式を使用する
<a name="aws-glue-programming-etl-format-avro-home"></a>

AWS Glue はソースからデータを取得し、さまざまなデータ形式で保存および転送されたターゲットにデータを書き込みます。このドキュメントでは、データが Avro データ形式で保存または転送される場合に、AWS Glue でデータを使用する際に利用できる機能について説明します。

AWS Glue は Avro 形式の使用をサポートしています。この形式は、パフォーマンス指向の行ベースのデータ形式です。標準局による形式の概要については、「[Apache Avro 1.8.2 Documentation](https://avro.apache.org/docs/1.8.2/)」(Apache Avro ドキュメント 1.8.2) を参照してください。

AWS Glue を使用して、Amazon S3 およびストリーミングソースから Avro ファイルを読み取り、Avro ファイルを Amazon S3 に書き込むことができます。S3 から、Avro ファイルが含まれる `bzip2` および `gzip` アーカイブを読み書きすることができます。さらに、Avro ファイルが含まれる `deflate`、`snappy`、`xz` アーカイブを書き込むこともできます。このページで説明する設定ではなく、[S3 接続パラメータ](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) 上で圧縮動作を設定します。

次の表は、Avro 形式のオプションをサポートする一般的な AWS Glue オペレーションを示しています。


| 読み込み | 書き込み | ストリーミングの読み取り | 小さなファイルのグループ化 | ジョブのブックマーク | 
| --- | --- | --- | --- | --- | 
| サポート | サポート | サポート対象\$1 | サポートされていません | サポート | 

制限付きで、\$1 がサポートされています。詳細については、「[Avro ストリーミングソースに関する注意事項と制約事項](add-job-streaming.md#streaming-avro-notes)」を参照してください。

## 例: S3 から Avro ファイルまたはフォルダを読み取る
<a name="aws-glue-programming-etl-format-avro-read"></a>

**前提条件:** 読み取る Avro ファイルまたはフォルダへの S3 パス (`s3path`) が必要です。

**設定:** 関数オプションで `format="avro"` を指定します。`connection_options` で、`paths` キーを使用して `s3path` を指定します。リーダーが S3 とやり取りする方法は、`connection_options` で設定できます。詳細については、AWS Glue: [Amazon S3 接続のオプションのリファレンス](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) の「ETL の入力および出力のデータ形式オプション」を参照してください。リーダーが Avro ファイルを解釈する方法は、`format_options` で設定できます。詳細については、[Avro 設定リファレンス](#aws-glue-programming-etl-format-avro-reference)を参照してください。

次の AWS Glue ETL スクリプトは、S3 から Avro ファイルまたはフォルダを読み取るプロセスを示しています。

------
#### [ Python ]

この例では [create\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-create_dynamic_frame_from_options) メソッドを使用します。

```
from pyspark.context import SparkContext
from awsglue.context import GlueContext

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

dynamicFrame = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://s3path"]},
    format="avro"
)
```

------
#### [ Scala ]

この例では [getSourceWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSourceWithFormat) 操作を使用します。

```
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.GlueContext
import org.apache.spark.sql.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)

    val dynamicFrame = glueContext.getSourceWithFormat(
      connectionType="s3",
      format="avro",
      options=JsonOptions("""{"paths": ["s3://s3path"]}""")
    ).getDynamicFrame()
  }
```

------

## 例: Avro ファイルおよびフォルダを S3 に書き込む
<a name="aws-glue-programming-etl-format-avro-write"></a>

**前提条件:** 初期化された DataFrame (`dataFrame`) または DynamicFrame (`dynamicFrame`) が必要です。また、予想される S3 出力パスである `s3path` も必要になります。

**設定:** 関数オプションで `format="avro"` を指定します。`connection_options` で、`paths` キーを使用して `s3path` を指定します。ライターが S3 と対話する方法を、`connection_options` でさらに詳しく変更することができます。詳細については、AWS Glue: [Amazon S3 接続のオプションのリファレンス](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) の「ETL の入力および出力のデータ形式オプション」を参照してください。リーダーが Avro ファイルを解釈する方法は、`format_options` で変更できます。詳細については、[Avro 設定リファレンス](#aws-glue-programming-etl-format-avro-reference)を参照してください。

次の AWS Glue ETL スクリプトは、S3 に Avro ファイルまたはフォルダを書き込むプロセスを示しています。

------
#### [ Python ]

この例では [write\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-write_dynamic_frame_from_options) メソッドを使用します。

```
from pyspark.context import SparkContext
from awsglue.context import GlueContext

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

glueContext.write_dynamic_frame.from_options(
    frame=dynamicFrame,
    connection_type="s3",
    format="avro",
    connection_options={
        "path": "s3://s3path"
    }
)
```

------
#### [ Scala ]

この例では [getSinkWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSinkWithFormat) メソッドを使用します。

```
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.{DynamicFrame, GlueContext}
import org.apache.spark.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)

    glueContext.getSinkWithFormat(
      connectionType="s3",
      options=JsonOptions("""{"path": "s3://s3path"}"""),
      format="avro"
    ).writeDynamicFrame(dynamicFrame)
  }
}
```

------

## Avro 設定リファレンス
<a name="aws-glue-programming-etl-format-avro-reference"></a>

AWS Glue ライブラリが `format="avro"` を指定する場合は、以下の `format_options` を使用することができます。
+ `version` – サポートする Apache Avro リーダー/ライター形式のバージョンを指定します。デフォルト値は「1.7」です。Avro 論理型の読み取りと書き込みを有効にするには、`format_options={"version": “1.8”}` を指定します。詳細については、「[Apache Avro 1.7.7 の仕様](https://avro.apache.org/docs/1.7.7/spec.html)」および「[Apache Avro 1.8.2 の仕様](https://avro.apache.org/docs/1.8.2/spec.html)」を参照してください。

  Apache Avro 1.8 コネクタは、次の論理型変換をサポートしています。

リーダーの場合: この表に、Avro リーダー 1.7 と 1.8 について、Avro データ型 (論理型と Avro プリミティブ型) と AWS Glue`DynamicFrame` データ型の間での型変換を示します。


| Avro データ型: 論理型 | Avro データ型: Avro プリミティブ型 | GlueDynamicFrame データ型:Avro リーダー 1.7 | GlueDynamicFrame データ型: Avro リーダー 1.8 | 
| --- | --- | --- | --- | 
| 10 進数 | bytes | BINARY | 10 進数 | 
| 10 進数 | 固定 | BINARY | 10 進数 | 
| 日付 | int | INT | 日付 | 
| 時間 (ミリ秒) | int | INT | INT | 
| 時間 (マイクロ秒) | long | LONG | LONG | 
| タイムスタンプ (ミリ秒) | long | LONG | Timestamp | 
| タイムスタンプ (マイクロ秒) | long | LONG | LONG | 
| 所要時間 (論理型ではない) | 12 で固定 | BINARY | BINARY | 

ライターの場合: この表に、Avro ライター 1.7 と 1.8 について、データ型と Avro データ型 AWS Glue`DynamicFrame` の間での型変換を示します。


| AWS Glue`DynamicFrame` データ型 | Avro データ型:Avro ライター 1.7 | Avro データ型:Avro タイター 1.8 | 
| --- | --- | --- | 
| 10 進数 | 文字列 | decimal | 
| 日付 | 文字列 | date | 
| Timestamp | 文字列 | timestamp-micros | 

## Avro Spark DataFrame サポート
<a name="aws-glueprogramming-etl-format-avro-dataframe-support"></a>

Spark DataFrame API から Avro を使用するには、対応する Spark のバージョン用の Spark Avro プラグインをインストールする必要があります。ジョブで使用できる Spark のバージョンは、AWS Glue のバージョンによって決まります。Spark のバージョンの詳細については、「[AWS Glue バージョン](release-notes.md)」を参照してください。このプラグインは Apache によって管理されており、特定のサポートを保証するものではありません。

AWS Glue 2.0 - Spark Avro プラグインのバージョン 2.4.3 を使用します。この JAR は Maven Central にあります。[org.apache.spark:spark-avro\$12.12:2.4.3](https://search.maven.org/artifact/org.apache.spark/spark-avro_2.12/3.1.1/jar) を参照してください。

AWS Glue 3.0 - Spark Avro プラグインのバージョン 3.1.1 を使用します。この JAR は Maven Central にあります。[org.apache.spark:spark-avro\$12.12:3.1.1](https://search.maven.org/artifact/org.apache.spark/spark-avro_2.12/3.1.1/jar) を参照してください。

AWS Glue の ETL ジョブに追加の JAR を含めるには、`--extra-jars` ジョブパラメータを使用します。ジョブパラメータについては、「[AWS Glue ジョブでジョブパラメータを使用する](aws-glue-programming-etl-glue-arguments.md)」を参照してください。AWS マネジメントコンソール で、このパラメータを設定することもできます。