本文为您介绍对表、分区、列执行DDL操作过程中的常见问题。
问题类别 | 常见问题 |
表操作 | |
分区操作 | |
列操作 | |
生命周期操作 |
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上的数据显示有延迟,一般会延迟一天。