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

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

对于 Amazon EMR 发行版 5.18.0 及更高版本,您可以将 S3 Select 与 Hive on Amazon EMR 搭配使用。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 响应,因此响应大小可能会根据压缩的输入文件而增大。

注意事项和限制

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

  • 不支持 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 文件创建表时指定 S3 Select,然后使用简单的 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;