DDL操作常见问题

本文为您介绍对表、分区、列执行DDL操作过程中的常见问题。

问题类别

常见问题

表操作

分区操作

列操作

生命周期操作

设置表的生命周期为3天,每个表的分区存储量很大,如何清理分区表旧数据?

MaxCompute支持虚拟表吗?例如MySQL中的DUAL表?

不支持虚拟表,您可以手动创建DUAL表。

MaxCompute的表有无索引?

没有索引,Hash Clustering可以提供类似数据库中Cluster index的效果,详情请参见表操作

如何修改表的Hash Clustering属性?

  • 增加表的Hash Clustering属性:alter table table_name [clustered by (col_name [, col_name, ...]) [sorted by (col_name [asc | desc] [, col_name [asc | desc] ...])] into number_of_buckets buckets];

  • 去除表的Hash Clustering属性:alter table table_name not clustered;

如何将非分区表修改为分区表?

不支持更改非分区表为分区表,也不支持增加分区列。您可以重新创建一张分区表,详情请参见表操作

因误操作删除的表可以恢复吗?

MaxCompute提供备份与恢复功能。但免费周期只有24小时,您可以自定义设置备份数据保留周期。如果误删除24小时内,可以通过备份与恢复命令恢复表数据。更多备份恢复信息,请参见备份与恢复

如何查询某个用户创建的表?

只查询某个用户创建的表可以使用元数据视图TABLES,通过owner_name字段过滤。更多TABLES信息,请参见TABLES

如何查看指定的表是否存在?

可以使用函数TABLE_EXISTS查看指定的表是否存在,更多函数信息,请参见TABLE_EXISTS

如何获取项目下的所有表名称?

您可以通过MaxCompute客户端执行show tables;命令或使用MaxCompute的元数据服务。更多信息请参见表操作Information Schema

如何快速查看项目下哪些表是分区表?

您可以通过MaxCompute客户端执行如下命令查看项目下的分区表信息。

select table_name from information_schema.columns where is_partition_key = true group by table_name;

如何查看MaxCompute表的最近访问时间?

您可以在DataWorks数据地图中查询表,进入表详情页面获取表的最近访问时间。技术信息

如何查看表的数据量?

查看表的数据量包含查看数据条数和占用的物理空间大小:

  • 您可以执行desc命令查看全量表的物理空间。执行SQL语句select count() as cnt from table_name;查看表的数据条数。查看物理空间

  • 您可以执行desc命令和WHERE条件组合方式,查看分区表单个分区占用的物理空间大小。执行SQL语句select count() as cnt from table_name where ...;查看分区数据条数。查看分区表

如何查看表的行数?

您可以通过MaxCompute客户端执行select count(*) from table_name;命令查看分区表或非分区表的行数。

创建的表为什么在DataWorks上看不到?

如果表不是通过DataWorks可视化创建方式创建的,而是通过SQL语句创建,DataWorks界面不会立即显示创建的表,会存在2~3个小时的延时。

分区和分区列的区别是什么?

MaxCompute中的表可以分区,分区表有分区列。您可以通过分区列创建分区。

例如分区ds=20150101,此处ds是一个分区列,而ds=20150101是一个分区。

一张表的分区的数量是否越多越好?

在MaxCompute中,一张表最多允许有60000个分区,同时每个分区的容量没有上限。但是分区数量过多,不便于统计和分析。

MaxCompute限制单个作业中最多不能超过一定数量的Instance,而作业中的Instance数量和输入的数据量以及分区数量是密切相关的,所以您需要根据业务情况,选择合适的分区策略。

如果源表没有分区字段,是否可以增加或更改分区?

MaxCompute不支持在源表上直接增加或修改分区字段,分区字段一旦创建就无法修改。您可以重新创建一张分区表,使用动态分区SQL将源表数据导入至新分区表,详情请参见插入或覆写动态分区数据(DYNAMIC PARTITION)

如何查看指定的分区是否存在?

可以使用函数PARTITION_EXISTS查看指定的分区是否存在,更多函数信息,请参见PARTITION_EXISTS

如何查看分区数量?

您可以通过Information Schema的PARTITIONS视图,获取到分区名,进而获取到分区数量。

是否可以添加或删除列?

在MaxCompute中,可以添加列,也可以删除列,目前添加复杂数据类型列和删除列正在邀测中,试用操作详情请参见新功能测试申请

如何添加列?

添加列的命令示例如下。如果表中已经存在一部分数据,则新添加列的值为NULL。

alter table table_name add columns (col_name1 type1, col_name2 type2…);

更多添加列语法信息,请参见添加列

如何设置自增长列?

MaxCompute不支持自增长列功能,如果您有此需求,且数据量比较小,建议使用ROW_NUMBER实现。

MaxCompute单表可以存放的最大列数是多少?

MaxCompute单表可以存放的最大列数为1200列。如果您的列数超过限制,可以参考如下方式处理:

  • 对数据进行降维,缩减到1200列以内。

  • 修改数据的保存方式,例如设备证书、稀疏或稠密矩阵。

待创建表的列名与关键字相同,如何解决?

在对表、列或分区命名时如果使用关键字,需要给关键字加``符号进行转义,否则会报错。

如何修改列的数据类型?

不支持修改列的数据类型,只能添加列。生产环境中的表不允许删除表字段、修改表字段和分区字段。如果必须修改,请删除表之后重新建表。您也可以创建外部表,删除并重建表后,可以重新加载数据。数据类型详情请参见数据类型版本说明

设置表的生命周期为3天,每个表的分区存储量很大,如何清理分区表旧数据?

设置了生命周期的表超过设定时间没有修改,MaxCompute会自动回收。

您可以执行desc table_name partition(pt_spec);命令查看旧的分区修改时间是否在生命周期内修改过。通过desc tablename;命令查看生命周期时间,MaxComptue每天17:00点进行回收,DataWorks上的数据显示有延迟,一般会延迟一天。