本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 S3 Select 與 Hive 搭配使用以提升效能
對於 Amazon EMR5.18.0 版及更新版本,您可以在 Amazon 上使用 S3 Select
在 Hive 工作階段true
期間將s3select.filter
組態變數設定為 ,Hive 資料表會根據 和 JSON 檔案CSV支援 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檔案建立資料表,然後使用簡單的選取陳述式查詢資料表時指定 S3 Select。
範例 CREATE TABLE 基於 的資料表的 陳述CSV式
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" );
範例 CREATE TABLE 基於 的資料表的 陳述JSON式
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;