

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

# S3 Select と Spark を使用してクエリパフォーマンスを向上させる
<a name="emr-spark-s3select"></a>

**重要**  
新規のお客様への Amazon S3 Select の提供は終了しました。Amazon S3 Select をご利用の既存のお客様は、今後も通常どおり使用できます。[詳細はこちら](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon EMR リリース 5.17.0 以降では、Amazon EMR での Spark を使用した [S3 Select](https://aws.amazon.com/blogs/aws/s3-glacier-select/) を使用できます。*S3 Select* では、アプリケーションはオブジェクトに含まれるデータのサブセットのみを取得できます。Amazon EMR では、大量のデータセットをフィルタリングして処理する計算作業をクラスターから Amazon S3 に「プッシュダウン」することにより、一部のアプリケーションのパフォーマンスを高めることができます。また、Amazon EMR と Amazon S3 の間で転送されるデータの量も削減されます。

S3 Select は、`s3selectCSV` および `s3selectJSON` 値を使用してデータ形式を指定する CSV ファイルと JSON ファイルでサポートされます。詳細な説明と例については、[コードで S3 Select を指定する](#emr-spark-s3select-specify) を参照してください。

## S3 Select が使用するアプリケーションに適しているかどうかを確認する
<a name="emr-spark-s3select-apps"></a>

S3 Select が使用するアプリケーションに適しているかどうかを確認するために、S3 Select を使用した場合と使用しない場合のアプリケーションのベンチマークを行うことをお勧めします。

アプリケーションが S3 Select を使用する候補となるかどうかを判断するには、次のガイドラインを使用します。
+ クエリは元のデータセットの半分以上を除外する。
+ Amazon S3 と Amazon EMR クラスター間のネットワーク接続は、転送速度と使用可能な帯域幅が良好です。Amazon S3 は、HTTP 応答を圧縮しないため、応答サイズは圧縮された入力ファイルと比較して増加する可能性があります。

## 考慮事項と制限事項
<a name="emr-spark-s3select-considerations"></a>
+ お客様が用意した暗号化キーを使用した Amazon S3 サーバー側の暗号化 (SSE-C) とクライアント側の暗号化はサポートされていません。
+ `AllowQuotedRecordDelimiters` プロパティはサポートされていません。このプロパティを指定した場合、クエリは失敗します。
+ UTF-8 形式の CSV ファイルと JSON ファイルのみがサポートされています。複数行の CSV はサポートされません。
+ 圧縮されていないファイルか gzip ファイルのみがサポートされます。
+ `nanValue`、`positiveInf`、`negativeInf` などの Spark CSV と JSON のオプションや破損した記録に関連するオプション (failfast および dropmalformed モードなど) はサポートされません。
+ 小数でのカンマ (,) の使用はサポートされません。たとえば、`10,000` はサポートされませんが、`10000` はサポートされます。
+ 最後の行のコメント文字はサポートされていません。
+ ファイルの末尾にある空の行は処理されません。
+ 次のフィルターは Amazon S3 にプッシュダウンされません。
  + `COUNT()` や `SUM()` などの集計関数。
  + 属性を `CAST()` するフィルター。例えば、`CAST(stringColumn as INT) = 1`。
  + オブジェクトの属性、または複雑な属性を持つフィルター。例えば、`intArray[1] = 1, objectColumn.objectNumber = 1`。
  + 値がリテラル値ではないフィルター。例: `intColumn1 = intColumn2`
  + 確認された制限のある [S3 Select がサポートするデータ型](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-data-types.html)のみがサポートされます。

## コードで S3 Select を指定する
<a name="emr-spark-s3select-specify"></a>

次の例では、Scala、SQL、R、および PySpark を使用して CSV 用の S3 Select を指定する方法を示します。JSON 用の S3 Select も同じ方法で使用できます。オプション、デフォルト値、および制限の一覧については、「[オプション](#emr-spark-s3select-specify-options)」を参照してください。

------
#### [ PySpark ]

```
spark
  .read
  .format("s3selectCSV") // "s3selectJson" for Json
  .schema(...) // optional, but recommended
  .options(...) // optional
  .load("s3://path/to/my/datafiles")
```

------
#### [ R ]

```
read.df("s3://path/to/my/datafiles", "s3selectCSV", schema, header = "true", delimiter = "\t")
```

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

```
spark
  .read
  .format("s3selectCSV") // "s3selectJson" for Json
  .schema(...) // optional, but recommended
  .options(...) // optional. Examples:  
  // .options(Map("quote" -> "\'", "header" -> "true")) or
  // .option("quote", "\'").option("header", "true")
  .load("s3://path/to/my/datafiles")
```

------
#### [ SQL ]

```
CREATE TEMPORARY VIEW MyView (number INT, name STRING) USING s3selectCSV OPTIONS (path "s3://path/to/my/datafiles", header "true", delimiter "\t")
```

------

### オプション
<a name="emr-spark-s3select-specify-options"></a>

`s3selectCSV` と `s3selectJSON` を使用するときは、以下のオプションを利用できます。指定しない場合はデフォルト値が使用されます。

#### S3selectCSV のオプション
<a name="emr-spark-s3select-specify-options-csv"></a>


| オプション | デフォルト | 使用方法 | 
| --- | --- | --- | 
|  `compression`  |  `"none"`  |  圧縮が使用されているかどうかを示します。`"none"` 以外にサポートされる設定は `"gzip"` のみです。  | 
|  `delimiter`  |  ","  |  フィールドの区切り記号を指定します。  | 
|  `quote`  |  `'\"'`  |  引用文字を指定します。空の文字例は指定できず、文字列を空にすると XML が不正というエラーが表示されます。  | 
|  `escape`  |  `'\\'`  |  エスケープ文字を指定します。  | 
|  `header`  |  `"false"`  |  `"false"` はヘッダーがないことを指定します。`"true"` はヘッダーが最初の行にあることを指定します。最初の行のヘッダーのみがサポートされ、ヘッダーの前の空の行はサポートされません。  | 
|  コメント  |  `"#"`  |  コメント文字を指定します。コメントインジケーターを無効にすることはできません。つまり、`\u0000` という値はサポートされません。  | 
|  `nullValue`  |  ""  |    | 

#### S3selectJSON のオプション
<a name="emr-spark-s3select-specify-options-json"></a>


| オプション | デフォルト | 使用方法 | 
| --- | --- | --- | 
|  `compression`  |  `"none"`  |  圧縮が使用されているかどうかを示します。`"none"` 以外にサポートされる設定は `"gzip"` のみです。  | 
|  `multiline`  |  "false"  |  `"false"` は JSON が S3 Select `LINES` 形式であることを指定し、入力データの各行に 1 つの JSON オブジェクトが含まれていることを意味します。`"true"` は JSON が S3 Select `DOCUMENT` 形式であることを指定し、入力データの複数の行に JSON オブジェクトをまたがらせられることを意味します。  | 