将 S3 Select 与 Hive 结合使用以提高查询性能
重要
不再向新客户提供 Amazon S3 Select。Amazon S3 Select 的现有客户可以像往常一样继续使用该功能。了解更多
对于 Amazon EMR 发行版 5.18.0 及更高版本,您可以将 S3 Select
借助基于 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;