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
原文连接 本文为云栖社区原创内容,未经容许不得转载。