将 S3 Select 与 Spark 结合使用以提高查询性能 - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 S3 Select 与 Spark 结合使用以提高查询性能

在 Amazon EMR 发布版 5.17.0 及更高版本中,您可以将 S3 Select 与 Amazon EMR 上的 Spark 结合使用。S3 Select 可让应用程序仅从对象检索数据子集。对于 Amazon EMR,筛选要处理的大数据集的计算工作从集群“向下推送”到 Amazon S3,这可以在某些应用程序中提高性能和减少 Amazon EMR 与 Amazon S3 之间传输的数据量。

S3 Select 支持使用 s3selectCSVs3selectJSON 值来指定数据格式的 CSV 和 JSON 文件。有关更多信息以及示例,请参阅 在代码中指定 S3 Select

S3 Select 是否适合我的应用程序?

建议您分别在使用和不使用 S3 Select 的情况下测试您的应用程序,以查看 S3 Select 是否适用于您的应用程序。

使用以下准则来确定您的应用程序是否为使用 S3 Select 的候选项:

  • 您的查询将筛选掉原始数据集的一半以上的数据。

  • Amazon S3 和 Amazon EMR 集群之间的网络连接具有很好的传输速度和可用带宽。Amazon S3 不压缩 HTTP 响应,因此响应大小可能会针对压缩的输入文件增大。

注意事项和限制

  • 使用客户提供的密钥 (SSE-C) 进行的 Amazon S3 服务器端加密与客户端加密都不受支持。

  • 不支持 AllowQuotedRecordDelimiters 属性。如果指定该属性,则查询将失败。

  • 仅支持采用 UTF-8 格式的 CSV 和 JSON 文件。多线 CSVs 不支持。

  • 仅支持未压缩文件或 gzip 文件。

  • 不支持 Spark CSV 和 JSON 选项(如 nanValuepositiveInfnegativeInf)以及与损坏记录相关的选项(例如,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 支持的数据类型支持记录在案的限制。

在代码中指定 S3 Select

以下示例展示了如何使用Scala、SQL、R和为CSV指定S3Select PySpark。您可以以相同的方式使用S3SelectforJSON。有关选项、默认值和限制的列表,请参阅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")

Options

使用时,以下选项可用 s3selectCSVs3selectJSON。如果未指定,则使用默认值。

选项 S3selectCSV

选项 Default 用法

compression

"none"

表示是否使用压缩。"gzip" 是唯一受支持的设置 "none".

delimiter

","

指定字段分隔符。

quote

'\"'

指定引号字符。不支持指定空字符串,这样做会导致 XML 格式不正确错误。

escape

'\\'

指定转义字符。

header

"false"

"false" 指定没有标题。"true" 指定标题位于第一行。仅支持第一行中的标头,不支持标头前面的空行。

comment

"#"

指定注释字符。无法禁用注释标记。换句话说,不支持值 \u0000

nullValue

""

选项 S3selectJSON

选项 Default 用法

compression

"none"

表示是否使用压缩。"gzip" 是唯一受支持的设置 "none".

multiline

“false”

"false" 指定JSON位于S3Select LINES 格式,表示输入数据中的每一行包含单个JSON对象。"true" 指定JSON位于S3Select DOCUMENT 格式,表示JSON对象可以跨越输入数据中的多行。