本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 S3 Select 与 Hive 结合使用以提高查询性能
重要
不再向新客户提供 Amazon S3 Select。Amazon S3 Select 的现有客户可以像往常一样继续使用该功能。了解更多
在亚马逊EMR发布版本 5.18.0 及更高版本中,您可以在亚马逊上将 S3 Selec
基于CSV和JSON文件的 Hive 表以及在 Hive 会话true
期间将s3select.filter
配置变量设置为,即可支持 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
属性。如果指定该属性,则查询将失败。 -
仅支持CSV和 UTF -8 格式的JSON文件。不支持多JSON行CSVs和。
-
仅支持未压缩文件或 gzip、或 bzip2 文件。
-
不支持最后一行中的注释字符。
-
文件末尾的空行不会被处理。
-
Amazon 上的 Hive 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。
例 CREATETABLECSV基于表的语句
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" );
例 CREATETABLEJSON基于表的语句
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" );
例 SELECTTABLE声明
SET s3select.filter=true; SELECT * FROM mys3selecttable WHERE col2 > 10;