欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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-Nowhttps://github.com/josonle/BigData-Learning