

# Avro SerDe
<a name="avro-serde"></a>

Avro SerDe を使用して、Avro データから Athena テーブルを作成します。

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

Avro SerDe のシリアル化ライブラリ名は `org.apache.hadoop.hive.serde2.avro.AvroSerDe` です。技術情報については、Apache ドキュメントの「[AvroSerDe](https://cwiki.apache.org/confluence/display/Hive/AvroSerDe)」を参照してください。

## Avro SerDe を使用する
<a name="avro-serde-using"></a>

セキュリティ上の理由から、At​​hena はテーブルスキーマを指定するために `avro.schema.url` を使用することをサポートしていません。代わりに `avro.schema.literal` を使用してください。

Avro 形式のデータからスキーマを抽出するには、インストールされている Avro リリースの `java` サブディレクトリにある Apache `avro-tools-<version>.jar` ファイルを使用します。次の例のように、`getschema` パラメータを使用して、`WITH SERDEPROPERTIES` ステートメントで使用できるスキーマを返します。

```
java -jar avro-tools-1.8.2.jar getschema my_data.avro
```

Avro をダウンロードする場合は、[Apache Avro リリース](http://avro.apache.org/releases.html#Download)を参照してください。Apache Avro Tools を直接ダウンロードする場合は、[Apache Avro tools Maven リポジトリ](https://mvnrepository.com/artifact/org.apache.avro/avro-tools)を参照してください。

スキーマを取得したら、`CREATE TABLE` ステートメントを使用して、Amazon S3 に保存されている基盤となる Avro データに基づいて Athena テーブルを作成します。`CREATE TABLE` ステートメントで Avro SerDe を指定するには、`ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'` を使用します。次の例のように、`WITH SERDEPROPERTIES` 句を使用してスキーマを指定します。

**注記**  
`s3://athena-examples-myregion/path/to/data/` の *myregion* を、Athena が実行されるリージョンの識別子 (`s3://athena-examples-us-west-1/path/to/data/` など) に置き換えます。

```
CREATE EXTERNAL TABLE flights_avro_example (
   yr INT,
   flightdate STRING,
   uniquecarrier STRING,
   airlineid INT,
   carrier STRING,
   flightnum STRING,
   origin STRING,
   dest STRING,
   depdelay INT,
   carrierdelay INT,
   weatherdelay INT
)
PARTITIONED BY (year STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES ('avro.schema.literal'='
{
   "type" : "record",
   "name" : "flights_avro_subset",
   "namespace" : "default",
   "fields" : [ {
      "name" : "yr",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "flightdate",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "uniquecarrier",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "airlineid",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "carrier",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "flightnum",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "origin",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "dest",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "depdelay",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "carrierdelay",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "weatherdelay",
      "type" : [ "null", "int" ],
      "default" : null
    } ]
}
')
STORED AS AVRO
LOCATION 's3://athena-examples-myregion/flight/avro/';
```

テーブルに対して `MSCK REPAIR TABLE` ステートメントを実行し、パーティションのメタデータを更新します。

```
MSCK REPAIR TABLE flights_avro_example;
```

出発の合計数で上位 10 の出発都市をクエリします。

```
SELECT origin, count(*) AS total_departures
FROM flights_avro_example
WHERE year >= '2000'
GROUP BY origin
ORDER BY total_departures DESC
LIMIT 10;
```

**注記**  
フライトテーブルデータは、米国運輸省の[運輸統計局](http://www.transtats.bts.gov/)が提供する [Flights](http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&amp;DB_Short_Name=On-Time) からのものです。オリジナルを白黒に変換しています。