蛮多客户提过需求:要给一个表添加列,之前推荐的做法是让客户把表删掉重建,因为DLA是计算存储分离的,删掉的其实只是计算层的元数据,存储层的数据不会动,还是比较轻量级的一个操作。不过这种做法对于一些有特别多分区的表来说代价还是还是挺大的,要删掉所有的分区,而且可能会影响其它正在使用这个表的任务,为了解决用户的这个痛点,我们现在对部分数据源(Parquet/ORC/OTS)进行了的Alter Table Add Column的支持。
Alter Table Add Column
下面我们以Parquet表为例来介绍一下这个功能。首先我们先创建一个parquet的库表:
mysql> CREATE DATABASE alter_table_add_column_db with dbproperties (
-> catalog = 'oss',
-> location = 'oss://hello/datasets/test/');
Query OK, 0 rows affected (0.58 sec)
mysql> CREATE EXTERNAL TABLE alter_table_add_column_db.`parquet_test` (
-> `id` int,
-> `name` string,
-> `age` int
-> )
-> stored as parquet
-> LOCATION 'oss://hello/datasets/test/alter_table_add_column_db/parquet_test/'
-> TBLPROPERTIES (
-> 'auto.create.location' = 'true'
-> );
Query OK, 0 rows affected (0.65 sec)
我们再往里面插入一条数据进行验证:
mysql> insert into alter_table_add_column_db.`parquet_test` values (1, 'james', 10);
+------+
| rows |
+------+
| 1 |
+------+
1 row in set (0.98 sec)
mysql> select * from alter_table_add_column_db.`parquet_test`;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | james | 10 |
+------+-------+------+
1 row in set (0.23 sec)
然后我们添加一个列:
mysql> alter table alter_table_add_column_db.`parquet_test` add columns(gender string);
Query OK, 0 rows affected (0.94 sec)
查询一下老数据:
mysql> select * from alter_table_add_column_db.`parquet_test`;
+------+-------+------+--------+
| id | name | age | gender |
+------+-------+------+--------+
| 1 | james | 10 | NULL |
+------+-------+------+--------+
1 row in set (0.27 sec)
可以看到,新加的列有了,对于老数据这个列的值是NULL。我们再来插入一条新数据,这个新数据里面新列gender是有值的:
mysql> insert into alter_table_add_column_db.`parquet_test` values (2, 'bond', 20, 'male');
+------+
| rows |
+------+
| 1 |
+------+
1 row in set (0.91 sec)
最后再来验证一下插入之后新老数据:
mysql> select * from alter_table_add_column_db.`parquet_test`;
+------+-------+------+--------+
| id | name | age | gender |
+------+-------+------+--------+
| 1 | james | 10 | NULL |
| 2 | bond | 20 | male |
+------+-------+------+--------+
2 rows in set (0.32 sec)
可以看到新老数据对于新字段gender都有了对应的正确的值。
Happy DLAing.
欢迎关注数据湖技术社区
数据湖开发者社区由 阿里云开发者社区 与 阿里云Data Lake Analytics团队 共同发起,致力于推广数据湖相关技术,包括hudi、delta、spark、presto、oss、元数据、存储加速、格式发现等,学习如何构建数据湖分析系统,打造适合业务的数据架构。