教程:如何在Data Lake Analytics中使用臨時表

前言

Data Lake Analytics (後文簡稱DLA)是阿里雲重磅推出的一款用於大數據分析的產品,可以對存儲在OSS,OTS上的數據進行查詢分析。相較於傳統的數據分析產品,用戶無需將數據重新加載至DLA,只需在DLA中創建一張與數據源關聯的表,不僅簡化了分析過程,還節約了存儲成本,是做大數據分析的不二之選。

當用戶想通過DLA對OSS上的某個文件或者目錄進行查詢時,第一步需要先針對該文件或目錄在DLA中創建一個table。當查詢結束後,如果該table將不再使用,需要用戶手動執行drop命令進行清理。

在實際應用的某些場景中,有些table只在查詢中使用一次即可,但每次使用都要手動建表刪表。這時,用戶可以選擇使用DLA的臨時表。該表的生命週期僅限於一條查詢語句,當查詢結束後,臨時表將被自動刪除。

本文將以OSS數據源爲例,重點介紹如何在查詢語句中定義和使用臨時表。

臨時表

在DLA中,用戶可以在查詢SQL中嵌入建表語句(即,對臨時表的定義),從而對嵌入的臨時表進行查詢。

示例1:查詢中只包含一個臨時表,且建表語句相對簡單。

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。

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:建表語句中含有多個臨時表

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
  1. 目錄mytable下的所有文件有着相同的數據結構,即表結構相同
  2. 每次SQL查詢只針對一個文件,即dataN.csv

此時,用戶可以考慮使用臨時表進行查詢,每次只需替換SQL中臨時表的LOCATION路徑值即可。

注意事項

  1. 在一條查詢語句中的多個臨時表,其表名不能相同,需要在該查詢語句中具有唯一性;
  2. 在執行查詢前,需要先選定一個database,可以執行 use ;
  3. 臨時表的路徑需要是當前database所指目錄下的子目錄或者文件。

更多文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章