Hive中Create table... as 和 Create table ... like 的区别和使用注意
程序员文章站
2022-06-03 08:01:14
...
CTAS建表语句(CREATE TABLE AS SELECT)
-
使用查询创建并填充表,select中选取的列名会作为新表的列名(所以通常是要取别名)
-
会改变表的属性、结构,比如只能是内部表、分区分桶也没了
- 目标表不允许使用分区分桶的,
FAILED: SemanticException [Error 10068]: CREATE-TABLE-AS-SELECT does not support partitioning in the target table
对于旧表中的分区字段,如果通过select * 的方式,新表会把它看作一个新的字段,这里要注意 - 目标表不允许使用外部表,如create external table … as select…报错
FAILED: SemanticException [Error 10070]: CREATE-TABLE-AS-SELECT cannot create external table
- CTAS创建的表存储格式会变成默认的格式TEXTFILE
- 对了,还有字段的注释comment也会丢掉,同时新表也无法加上注释
- 目标表不允许使用分区分桶的,
-
但可以在CTAS语句中指定表的存储格式,行和列的分隔符等
create table xxx as select ...
create table xxx
row format delimited
fields terminated by ' '
stored as parquet
as
select ...
如何快速复制一张分区表?
-
create table... like...
+insert into table ... partition(xxx)...select...
- 或者通过hdfs复制数据并修复新表的分区相关元数据
create table newtable like oldtable
hdfs dfs -cp /old_table/ /path/new_table/
msck repair table newtable
第一种方法会慢很多,但涉及要对旧表进行相关操作的话,也就只能用第一种动态分区的方法
create [external] table partition_test like old_table;
insert into table partition_test
partition(dt)
select
trim(userid) userid,
trim(cardno) cardno,
if(lower(trim(flag)) in ("true","1","01"),"1","0") flag,
substr(cardtype,1,1) cardtype,
trim(times) times,
substr(times,0,10) dt
from old_table
order by rand()
limit 100;
CREATE TABLE LIKE 语句
- 用来复制表的结构
- 需要外部表的话,通过create external table as …指定
- 不CTAS语句会填充数据
更多大数据相关Tips可以关注:https://github.com/josonle/Coding-Now 和 https://github.com/josonle/BigData-Learning
上一篇: 同步linux服务时间
下一篇: 容器中的成员函数swap