DLA支持Parquet/ORC/OTS表的Alter Table Add Column

蛮多客户提过需求:要给一个表添加列,之前推荐的做法是让客户把表删掉重建,因为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、元数据、存储加速、格式发现等,学习如何构建数据湖分析系统,打造适合业务的数据架构。

DLA支持Parquet/ORC/OTS表的Alter Table Add Column

上一篇:go-mysql-elasticsearch实现mysql 与elasticsearch实时同步深入详解


下一篇:Presto Core Data Structures: Slice, Block & Page