Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

借助基于 CSV 和 JSON 文件的 Hive 表并在 Hive 会话期间将 s3select.filter 配置变量设置为 true,从而支持 S3 Select。有关更多信息以及示例,请参阅 在代码中指定 S3 Select

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

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

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

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

  • 您的查询筛选谓词使用具有 Amazon S3 Select 支持的数据类型的列。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南中的数据类型

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

注意事项和限制

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

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

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

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

  • 不支持最后一行中的注释字符。

  • 文件末尾的空行不会被处理。

  • Hive on Amazon EMR 支持 S3 Select 所支持的基元数据类型。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南中的数据类型

在代码中指定 S3 Select

要在 Hive 表中使用 S3 Select,请通过指定 com.amazonaws.emr.s3select.hive.S3SelectableTextInputFormat 作为 INPUTFORMAT 类名来创建表,并使用 TBLPROPERTIES 子句指定 s3select.format 属性的值。

默认情况下,在运行查询时将禁用 S3 Select。通过在 Hive 会话中将 s3select.filter 设置为 true 来启用 S3 Select,如下所示。以下示例说明如何在从基础 CSV 和 JSON 文件创建表并使用功能简单 select 语句查询表时指定 S3 Select。

例 基于 CSV 的表的 CREATE TABLE 语句

CREATE TABLE mys3selecttable ( col1 string, col2 int, col3 boolean ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS INPUTFORMAT 'com.amazonaws.emr.s3select.hive.S3SelectableTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://path/to/mycsvfile/' TBLPROPERTIES ( "s3select.format" = "csv", "s3select.headerInfo" = "ignore" );

例 基于 JSON 的表的 CREATE TABLE 语句

CREATE TABLE mys3selecttable ( col1 string, col2 int, col3 boolean ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazonaws.emr.s3select.hive.S3SelectableTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://path/to/json/' TBLPROPERTIES ( "s3select.format" = "json" );

例 SELECT TABLE 语句

SET s3select.filter=true; SELECT * FROM mys3selecttable WHERE col2 > 10;