Data Lake Analytics (後文簡稱DLA)是阿里雲重磅推出的一款用於大數據分析的產品,能夠對存儲在OSS,OTS上的數據進行查詢分析。相較於傳統的數據分析產品,用戶無需將數據從新加載至DLA,只需在DLA中建立一張與數據源關聯的表,不只簡化了分析過程,還節約了存儲成本,是作大數據分析的不二之選。apache
當用戶想經過DLA對OSS上的某個文件或者目錄進行查詢時,第一步須要先針對該文件或目錄在DLA中建立一個table。當查詢結束後,若是該table將再也不使用,須要用戶手動執行drop命令進行清理。數據結構
在實際應用的某些場景中,有些table只在查詢中使用一次便可,但每次使用都要手動建表刪表。這時,用戶能夠選擇使用DLA的臨時表。該表的生命週期僅限於一條查詢語句,當查詢結束後,臨時表將被自動刪除。oop
本文將以OSS數據源爲例,重點介紹如何在查詢語句中定義和使用臨時表。大數據
在DLA中,用戶能夠在查詢SQL中嵌入建表語句(即,對臨時表的定義),從而對嵌入的臨時表進行查詢。阿里雲
示例1:查詢中只包含一個臨時表,且建表語句相對簡單。spa
SELECT col1, col2 FROM TABLE temp_1 ( col1 int, col2 string ) LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt' -- 等效於 -> CREATE EXTERNAL TABLE temp_1 ( col1 int, col2 int ) LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt'; SELECT col1, col2 FROM temp_1;
示例2:查詢中只含有一個臨時表,建表語句中須要指定ROW FORMAT以及TBLPROPERITES。code
SELECT id, string_col FROM TABLE temp_2 ( id INT COMMENT 'default', string_col STRING COMMENT 'default' ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt' TBLPROPERTIES ('recursive.directories'='false'); -- 等效於 -> CREATE EXTERNAL TABLE temp_2 ( id INT COMMENT 'default', string_col STRING COMMENT 'default' ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt' TBLPROPERTIES ('recursive.directories'='false'); SELECT id, string_col from temp_2;
示例3:建表語句中含有多個臨時表orm
SELECT temp_1.col1, temp_2.smallint_col FROM TABLE temp_1 ( col1 int, col2 int ) LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt'; JOIN TABLE temp_2 ( id INT COMMENT 'default', bool_col BOOLEAN COMMENT 'default', tinyint_col TINYINT COMMENT 'default', smallint_col SMALLINT COMMENT 'default', int_col INT COMMENT 'default', bigint_col BIGINT COMMENT 'default', float_col FLOAT COMMENT 'default', double_col DOUBLE COMMENT 'default', date_string_col STRING COMMENT 'default', string_col STRING COMMENT 'default', timestamp_col TIMESTAMP COMMENT 'default' ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('field.delim'='|', 'serialization.format'='|') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'oss://test-bucket-for-dla/tbl2/tbl2.csv' TBLPROPERTIES ('recursive.directories'='false') ON temp_1.col1 = temp_2.id WHERE temp_2.bool_col = true; -- 等價於 -> CREATE EXTERNAL TABLE temp_1 ( col1 int, col2 int ) LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt'; CREATE EXTERNAL TABLE temp_2 ( id INT COMMENT 'default', bool_col BOOLEAN COMMENT 'default', tinyint_col TINYINT COMMENT 'default', smallint_col SMALLINT COMMENT 'default', int_col INT COMMENT 'default', bigint_col BIGINT COMMENT 'default', float_col FLOAT COMMENT 'default', double_col DOUBLE COMMENT 'default', date_string_col STRING COMMENT 'default', string_col STRING COMMENT 'default', timestamp_col TIMESTAMP COMMENT 'default' ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('field.delim'='|', 'serialization.format'='|') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'oss://test-bucket-for-dla/tbl2/tbl2.csv' TBLPROPERTIES ('recursive.directories'='false'); SELECT temp_1.col1, temp_2.smallint_col FROM temp_1 JOIN temp_2 ON temp_1.col1 = temp_2.id WHERE temp_2.bool_col = true;
當OSS的目錄下有數量較多的數據文件,這些文件的目錄結構以下:生命週期
oss://test-bucket-for-dla/mytable/data1.csv oss://test-bucket-for-dla/mytable/data2.csv ... oss://test-bucket-for-dla/mytable/dataN.csv
此時,用戶能夠考慮使用臨時表進行查詢,每次只需替換SQL中臨時表的LOCATION路徑值便可。hadoop
本文做者:金絡
本文爲雲棲社區原創內容,未經容許不得轉載。