Using S3 Select with Spark to Improve Query Performance - Amazon EMR


Using S3 Select with Spark to Improve Query Performance

Amazon EMR リリースバージョン 5.17.0 以降では、Amazon EMR での Spark で S3 Select を使用できます。S3 Select では、アプリケーションはオブジェクトに含まれるデータのサブセットのみを取得できます。Amazon EMR では、大量のデータセットをフィルタリングして処理する計算作業をクラスターから Amazon S3 に「プッシュダウン」することにより、一部のアプリケーションのパフォーマンスを向上させることができ、Amazon EMR と Amazon S3 間で転送されるデータの量が削減されます。

S3 Select は、s3selectCSV および s3selectJSON 値を使用してデータ形式を指定する CSV ファイルと JSON ファイルでサポートされます。 詳細な説明と例については、「Specifying S3 Select in Your Code」を参照してください。

Is S3 Select Right For My Application?

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

アプリケーションが S3 Select を使用する候補となるかどうかを判断するには、次のガイドラインを使用します。

  • Your query filters out more than half of the original data set.

  • Your network connection between Amazon S3 and the Amazon EMR cluster has good transfer speed and available bandwidth. Amazon S3 does not compress HTTP responses, so the response size is likely to increase for compressed input files.

Considerations and Limitations

  • Amazon S3 server-side encryption with customer-provided encryption keys (SSE-C) and client-side encryption are not supported.

  • The AllowQuotedRecordDelimiters property is not supported. If this property is specified, the query fails.

  • Only CSV and JSON files in UTF-8 format are supported. Multi-line CSVs are not supported.

  • Only uncompressed or gzip files are supported.

  • Spark CSV and JSON options such as nanValue, positiveInf, negativeInf, and options related to corrupt records (for example, failfast and dropmalformed mode) are not supported.

  • Using commas (,) within decimals is not supported. For example, 10,000 is not supported and 10000 is.

  • Comment characters in the last line are not supported.

  • Empty lines at the end of a file are not processed.

  • The following filters are not pushed down to Amazon S3:

    • Aggregate functions such as COUNT() and SUM().

    • Filters that CAST() an attribute. For example, CAST(stringColumn as INT) = 1.

    • Filters with an attribute that is an object or is complex. For example, intArray[1] = 1, objectColumn.objectNumber = 1.

    • Filters for which the value is not a literal value. For example, intColumn1 = intColumn2

    • Only S3 Select Supported Data Types are supported with the documented limitations.

Specifying S3 Select in Your Code

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

spark .read .format("s3selectCSV") // "s3selectJson" for Json .schema(...) // optional, but recommended .options(...) // optional .load("s3://path/to/my/datafiles")
read.df("s3://path/to/my/datafiles", "s3selectCSV", schema, header = "true", delimiter = "\t")
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")
CREATE TEMPORARY VIEW MyView (number INT, name STRING) USING s3selectCSV OPTIONS (path "s3://path/to/my/datafiles", header "true", delimiter "\t")


次のオプションは、 s3selectCSV および s3selectJSON。 指定しない場合、デフォルト値が使用されます。

Options with S3selectCSV

オプション デフォルト値: 使用状況



圧縮が使用されているかどうかを示します。"gzip" は、 以外にサポートされている唯一の設定です。 "none".






引用文字を指定します。空の文字例は指定できず、文字列を空にすると XML が不正というエラーが表示されます。






"false" ヘッダーがないことを指定します。"true" ヘッダーが最初の行にあることを指定します。最初の行のヘッダーのみがサポートされ、ヘッダーの前の空の行はサポートされません。



コメント文字を指定します。コメントインジケーターを無効にすることはできません。つまり、\u0000 という値はサポートされません。



Options with S3selectJSON

オプション デフォルト値: 使用状況



圧縮が使用されているかどうかを示します。"gzip" は、 以外にサポートされている唯一の設定です。 "none".



"false" JSON が S3 Select にあることを指定します。 LINES 形式は、入力データの各行に1つのJSONオブジェクトが含まれることを意味します。"true" JSON が S3 Select にあることを指定します。 DOCUMENT JSON オブジェクトが入力データ内の複数の行にまたがることができることを意味します。