金络 2018-08-10 2941浏览量
Data Lake Analytics (后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS、TableStore上的数据进行查询分析。
在关系型数据库中,用户可以对大数据量的表进行分区,提高查询的性能。同样在DLA中,用户可以使用分区表将数据进行细化,达到缩短查询响应时间的目的。
本文将以OSS数据源为例,详细介绍如何在DLA中创建和使用分区表。
在DLA中,创建一张分区表需要在建表语句中指定 PARTITIONED BY, 例如
创建一张名为tbl3_part的分区表,该表有两个分区列,分别为p和q。
CREATE EXTERNAL TABLE tbl3_part
(foo int, bar string)
PARTITIONED BY (p string, q string)
STORED AS TEXTFILE
LOCATION 'oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/';
DLA可以将存储在OSS上的目录或文件映射成一张表。表中的数据就是OSS中的文件内容。
对于分区表来说,分区列对应OSS上的目录,而且是有特殊命名规则的目录:
对于上面例子中的建表语句,OSS上的目录结构为:
$osscmd ls oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3
prefix list is:
object list is:
2018-08-08 14:23:17 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/p=3/q=3/kv1.txt
2018-08-08 18:01:08 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/p=30/q=30/kv1.txt
建表成功后,需要执行 MSCK REPAIR TABLE 命令,将分区信息同步到DLA中。
MSCK REPAIR TABLE tbl3_part;
执行MSCK成功后,通过 SHOW PARTITIONS 语句可以看到表中所有的分区信息。
mysql> show partitions tbl3_part;
+-----------+
| Result |
+-----------+
| p=3/q=3 |
| p=30/q=30 |
+-----------+
MSCK只能识别符合DLA分区列命名规则的目录,即分区列的目录名为 分区列名=分区列值。
因此,当OSS上的分区目录发上变化时,执行MSCK命令,DLA可以根据OSS中当前分区值信息自动同步。
对于已经存在的但是不满足DLA分区列命名规则的目录,用户可以通过 ALTER命令更新表的分区信息。
语法:
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
可以一次指定添加多个分区,分区之间用逗号分隔。
示例,
ALTER TABLE order_part ADD
PARTITION (dt='2008-08-08', status='ready') location '/path/to/ready/part080808',
PARTITION (dt='2008-08-09', status='new') location '/path/to/new/part080809';
对于上面的语句,
语法:
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...];
可以一次指定删除多个分区,分区之间用逗号分隔。
示例,
ALTER TABLE order_part DROP
PARTITION (dt='2008-08-08', status='ready');
对于上面的语句,
全表查询时,得到的是所有分区下的数据。
mysql> select count(*) from tbl3_part;
+-------+
| _col0 |
+-------+
| 1000 |
+-------+
当执行 SELECT * 时,可以发现分区列将以列的形式出现在表中定义的数据列的后面。
mysql> select * from tbl3_part limit 3;
+------+---------+------+------+
| foo | bar | p | q |
+------+---------+------+------+
| 238 | val_238 | 3 | 3 |
| 86 | val_86 | 3 | 3 |
| 311 | val_311 | 3 | 3 |
+------+---------+------+------+
查询时可以使用分区列做filter
mysql> select count(*) from tbl3_part where p='3';
+-------+
| _col0 |
+-------+
| 500 |
+-------+
CREATE EXTERNAL TABLE tbl3_part
(col1 int, col2 string)
PARTITIONED BY (q string, p string)
STORED AS TEXTFILE
LOCATION 'oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/';
$osscmd ls oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/
prefix list is:
object list is:
2018-08-08 14:23:56 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/kv1.txt
2018-08-08 14:23:48 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/p=4/kv2.txt
2018-08-08 14:23:40 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/p=4/q=4/kv3.txt
如果建表语句中指定的分区列为 p 和 q,则该表的数据文件只有 kv3.txt.
数据文件 kv1.txt 和 kv2.txt 将不会被计算在内。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
云原生数据湖分析Data Lake Analytics是云原生数据湖的分析与计算产品形态,存储计算分离。提供 Serverless Spark、Serverless Presto、一站式数据湖管理;