create table ,create as 與create like建表方式的使用詳解

     Hive的hql是基於sql而來,而sql中關於表的創建有幾種方式。同樣,hive也支持這些表的創建方式。

     官網文檔關於建表的地址hive常見建表方式官網文檔

1.自主創業方式create table 

  使用create table從無到有,按照建表的格式和要求實現建表。實際開發中較常用的方式,主要可以定製化建表。

    具體參考博客:  https://blog.csdn.net/qq_26442553/article/details/79747906

                                https://blog.csdn.net/qq_26442553/article/details/78805443

CREATE TABLE DEDUCT_SIGN_D`(
  `id` bigint COMMENT '主鍵ID',
  `sign_no` string COMMENT '簽約協議號',
  `bp_no` string COMMENT '商戶號',
  `comments` string COMMENT '備註',
  `etl_create_time` string COMMENT 'ETL創建日期',
  `etl_update_time` string COMMENT 'ETL更新日期')
COMMENT '代扣簽約表'
PARTITIONED BY (
  `statis_date` string COMMENT '時間分區')

2.懶人模式create table ...as select..(CTAS)

     create table ......as 這種方式建表,很常用。主要是在hive項目開發中,會有很多邏輯聚合,以及臨時表等情況的時候。

2.1使用CTAS創建表的好處

   1.CTAS語句中使用查詢的結果創建和填充表。由CTAS創建的表是原子的,這意味着在填充所有查詢結果之前,其他用戶不會看到該表。因此,其他用戶要麼看到帶有完整查詢結果的表,要麼根本看不到表。

  2.在CTAS中有兩個部分,select選擇部分可以是HiveQL支持的任何選擇語句。CTAS的create創建部分從select選擇部分獲取結果模式,並可以使用SerDe和存儲格式等其他表屬性創建指定的目標表。比如指定行列切分格式等屬性。

    但是使用CTAS建表會有表結構的變化,以及使用CTAS建表的缺陷和限制,尤其要注意。具體參考博客:使用create table ...as創建表時要注意的問題

2.2使用CTAS創建表的演示

1.直接使用CTAS創建表,不指定創建部分的約束
create table finance.tmp_dm_rpt_110015_fsa_app_d_23 
as 
select  a.stat_date as stat_date    
  ,a.intfc_tp as intfc_tp
  ,a.trmnl_tp_id as trmnl_tp_id
  ,a.app_version  as app_version 
  ,a.clnt_chnl  as clnt_chnl
  ,a.trmnl_clnt as  trmnl_clnt 
from  finance.tmp_dm_rpt_110015_fsa_app_d_20_04  a
inner join finance.tmp_dm_rpt_110015_fsa_app_d_22 b
on b.trmnl_clnt=concat(a.trmnl_tp_id,a.clnt_id);

2.在create創建部分指定表的存儲格式等屬性,比如指定新表的行列分隔符,存儲格式等。
CREATE TABLE T_DEDUCT_SIGN_D_CTAS
   ROW FORMAT DELIMITED FIELDS TERMINATED BY '&'
   STORED AS ORC
AS
SELECT *  FROM T_DEDUCT_SIGN_D WHERE STATIS_DATE IS NOT NULL;

查看使用CTAS建表後的表結構:
hive (fdm_sor)> SHOW CREATE TABLE T_DEDUCT_SIGN_D_CTAS;
OK
CREATE TABLE `T_DEDUCT_SIGN_D_CTAS`(
  `id` bigint, 
  `sign_no` string, 
  `bp_no` string, 
  `statis_date` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '&' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://SuningHadoop2/user/finance/hive/warehouse/fdm_sor.db/t_deduct_sign_d_ctas'
TBLPROPERTIES (
  'transient_lastDdlTime'='1546422100')

查看錶中的數據
hive (fdm_sor)> hive (fdm_sor)> select count(*) from  T_DEDUCT_SIGN_D_CTAS;
438

總結:如上使用CTAS創建的表也可以指定存儲格式,字段名等。比如在select的時候給列指定別名,則在新表中就會將源表的列實現了重命名。此外在創建表時給目標表指定特定存儲格式,也可以完成數據從源表的存儲格式到目標表存儲格式的轉換。這是hive一個很強大的功能,數據存儲格式的轉換。後面也可以通過insert實現。

3.半自動化模式create table like.....

  使用這種方式創建的表用官網的話來說就是:The LIKE form of CREATE TABLE allows you to copy an existing table definition exactly (without copying its data). In contrast to CTAS, the statement below creates a new empty_key_value_store table whose definition exactly matches the existing key_value_store in all particulars other than table name. The new table contains no rows.大致意思就是:CREATE TABLE創建表的形式允許您精確地複製現有表定義(不復制其數據),其創建的表除了表名和源表不一樣外,其餘所有的細節都是一樣的。但是沒有源表的數據。所以這種create  table like的形式非常適合對源表模式的複製。實際開發中其實用的也不是太多。

create t__sign_d_like table like T_DEDUCT_SIGN_D
#查看目標表結構
hive (fdm_sor)> show create table t__sign_d_like;
OK
CREATE TABLE `t__sign_d_like`(
  `id` bigint COMMENT '主鍵ID', 
  `sign_no` string COMMENT '簽約協議號', 
  `bp_no` string COMMENT '商戶號')
PARTITIONED BY ( 
  `statis_date` string COMMENT '時間分區')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
LOCATION
  'hdfs://SuningHadoop2/user/finance/hive/warehouse/fdm_sor.db/t__sign_d_like'
TBLPROPERTIES (
  'transient_lastDdlTime'='1546420764')

#查看源表結構:
hive (fdm_sor)> show create table T_DEDUCT_SIGN_D;
CREATE TABLE `T_DEDUCT_SIGN_D`(
  `id` bigint COMMENT '主鍵ID', 
  `sign_no` string COMMENT '簽約協議號', 
  `bp_no` string COMMENT '商戶號')
COMMENT '代扣簽約表'
PARTITIONED BY ( 
  `statis_date` string COMMENT '時間分區')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
LOCATION
  'hdfs://SuningHadoop2/user/finance/hive/warehouse/fdm_sor.db/t_deduct_sign_d'
TBLPROPERTIES (
  'transient_lastDdlTime'='1546417837')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章