在成功創建了OSS外部表后,您可以訪問和查詢存儲在OSS指定目錄下的數據文件,實現高效的數據讀取操作。
背景信息
完成OSS外部表創建后,您可以根據需要選擇如下方式之一對OSS外部表進行操作:
(推薦)方式一:將OSS的開源格式數據導入MaxCompute內部表,然后再讀取OSS的數據。
如果直接使用OSS外部表,每次讀取數據都涉及OSS的I/O操作,且MaxCompute本身針對內部存儲設計的許多高性能優化都無法應用,因此性能上會有所損失。如果您需要對數據進行反復計算或對計算的高效性比較敏感,推薦先在MaxCompute項目中創建一個與OSS外部表Schema相同的內部表,然后將OSS上的數據導入MaxCompute內部表,在內部表上執行復雜查詢語句,以便獲得更高的計算性能。
命令示例如下。
CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>; INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>;
方式二:直接讀取OSS數據,與MaxCompute內部表的操作相同。
OSS外部表會被當作一個普通的內部表一樣使用,不同之處在于,MaxCompute是直接從OSS讀取對應的數據。
注意事項
在使用外部表讀取OSS數據時,需要注意:
您需要創建好OSS外部表后,才可以通過外部表讀取OSS數據。更多MaxCompute支持的OSS數據文件類型及創建OSS外部表命令信息,請參見創建OSS外部表語法。
SQL語句中涉及到復雜數據類型時,需要在SQL語句前添加
set odps.sql.type.system.odps2=true;
命令,和SQL語句一起提交執行。更多數據類型信息,請參見數據類型版本說明。對于映射開源數據的OSS外部表,您需要在Session級別設置
set odps.sql.hive.compatible=true;
后再讀取OSS數據,否則會報錯。OSS對外提供的帶寬是有限制的,若您頻繁讀取OSS數據,或者大量向OSS寫入數據,若短時間內產生的數據流量超過了OSS實例當前的帶寬限額,就會導致帶寬打滿。帶寬打滿直接影響到OSS外表的數據讀取和寫入速度。關于OSS帶寬詳情,請參見OSS有帶寬和QPS限制嗎?。
示例:讀取OSS數據-非分區表(內置文本數據解析器)
基于示例:通過內置文本數據解析器創建OSS外部表-非分區表中創建的OSS外部表mc_oss_csv_external1讀取OSS數據。
使用MaxCompute客戶端,從OSS讀取數據。命令示例如下。
SELECT recordId, patientId, direction FROM mc_oss_csv_external1 WHERE patientId > 25;
返回結果如下。
+------------+------------+------------+
| recordid | patientid | direction |
+------------+------------+------------+
| 1 | 51 | S |
| 3 | 48 | NE |
| 4 | 30 | W |
| 5 | 47 | S |
| 7 | 53 | N |
| 8 | 63 | SW |
| 10 | 31 | N |
+------------+------------+------------+
示例:讀取OSS數據-分區表(內置文本數據解析器)
基于示例:通過內置文本數據解析器創建OSS外部表-分區表中創建的OSS外部表mc_oss_csv_external2讀取OSS數據。
使用MaxCompute客戶端,從OSS讀取數據。命令示例如下。
SELECT recordId, patientId, direction FROM mc_oss_csv_external2 WHERE direction = 'NE';
返回結果如下。
+------------+------------+------------+
| recordid | patientid | direction |
+------------+------------+------------+
| 2 | 13 | NE |
| 3 | 48 | NE |
| 9 | 4 | NE |
+------------+------------+------------+
示例:讀取OSS壓縮數據(內置文本數據解析器)
基于示例:通過內置文本數據解析器創建OSS外部表-壓縮數據中創建的OSS外部表mc_oss_csv_external3讀取OSS數據。
使用MaxCompute客戶端,從OSS讀取數據。命令示例如下。
SELECT recordId, patientId, direction FROM mc_oss_csv_external3 WHERE patientId > 25;
如果OSS壓縮數據為開源數據格式,需要在SQL語句前添加set odps.sql.hive.compatible=true;
命令,與SQL語句一起提交執行。
返回結果如下。
+------------+------------+------------+
| recordid | patientid | direction |
+------------+------------+------------+
| 1 | 51 | S |
| 3 | 48 | NE |
| 4 | 30 | W |
| 5 | 47 | S |
| 7 | 53 | N |
| 8 | 63 | SW |
| 10 | 31 | N |
+------------+------------+------------+
示例:讀取OSS文本數據(自定義解析器)
基于示例:通過自定義解析器創建OSS外部表中創建的OSS外部表ambulance_data_txt_external讀取OSS數據。
使用MaxCompute客戶端,從OSS讀取數據。命令示例如下。
SELECT recordId, patientId, direction FROM ambulance_data_txt_external WHERE patientId > 25;
返回結果如下。
+----------+-----------+-----------+
| recordid | patientid | direction |
+----------+-----------+-----------+
| 1 | 51 | S |
| 3 | 48 | NE |
| 4 | 30 | W |
| 5 | 47 | S |
| 7 | 53 | N |
| 8 | 63 | SW |
| 10 | 31 | N |
+----------+-----------+-----------+
示例:讀取OSS非文本數據(自定義解析器)
基于示例:通過自定義解析器創建OSS外部表-非文本數據中創建的OSS外部表speech_sentence_snr_external讀取OSS數據。
使用MaxCompute客戶端,從OSS讀取并處理數據。命令示例如下。
SELECT sentence_snr, id FROM speech_sentence_snr_external WHERE sentence_snr > 10.0;
返回結果如下。
--------------------------------------------------------------
| sentence_snr | id |
--------------------------------------------------------------
| 34.4703 | J310209090013_H02_K03_042 |
--------------------------------------------------------------
| 31.3905 | tsh148_seg_2_3013_3_6_48_80bd359827e24dd7_0 |
--------------------------------------------------------------
| 35.4774 | tsh148_seg_3013_1_31_11_9d7c87aef9f3e559_0 |
--------------------------------------------------------------
| 16.0462 | tsh148_seg_3013_2_29_49_f4cb0990a6b4060c_0 |
--------------------------------------------------------------
| 14.5568 | tsh_148_3013_5_13_47_3d5008d792408f81_0 |
--------------------------------------------------------------
示例:讀取OSS數據-OSS中的數據有不同的Schema
讀取OSS外部表,當OSS數據有不同的Schema且需要根據列名稱查詢數據時,需要打開下面的Flag。
--查詢數據
SET odps.ext.oss.orc.native=true;
SELECT * FROM <tablename>;
示例:優化查詢計劃
由于數據存儲在外部數據湖且缺乏預先統計信息,查詢優化器采用保守策略,導致查詢效率低。打開下面的Flag后,該功能支持Optimizer在Query執行中臨時統計表的Stats來發現小表,并主動采用Hash Join、優化Join Order、減少大量Shuffle和縮短執行的Pipeline等方法,最終優化查詢計劃。
SET odps.meta.exttable.stats.onlinecollect=true;
SELECT * FROM <tablename>;