本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 S3 Select 與 Hive 搭配使用以提升效能
使用 Amazon EMR 版本 5.18.0 及更高版本,您可以在 Amazon 上將 S3 選擇
S3 Select 支援基於CSV和JSON檔案的 Hive 資料表,並在 Hive 工作階段true
期間將s3select.filter
組態變數設定為。如需詳細資訊和範例,請參閱 在您的程式碼中指定 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檔案。多重線CSVsJSON且不受支援。
-
僅支援未壓縮的檔案,或 gzip 或 bzip2 檔案。
-
不支援在最後一行的註解字元。
-
不會處理檔案尾端的空白行。
-
Amazon 上的蜂巢EMR支持 S3 選擇支持的原始數據類型。如需詳細資訊,請參閱《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;