1. 程式人生 > >hive建表的標準格式及其建表屬性詳解2

hive建表的標準格式及其建表屬性詳解2

建表方式一:demo級建表

hive (fdm_sor)> create table  my_tmp (id int,ids  string );

檢視建表語句(工作中經常使用的語句)

hive (fdm_sor)> show create tablemy_tmp;   

CREATE TABLE `my_tmp`(
 `id` int,
 `ids` string)
ROW FORMAT SERDE
 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STOREDAS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
 'hdfs://Hadoop2/user/finance/hive/warehouse/fdm_sor.db/my_tmp'
TBLPROPERTIES (
 'transient_lastDdlTime'='1522135161')

    可以看出實際上在hive底層建表默認了很多屬性(比如反引號的使用),使用者可以選擇自定義,也可以選擇預設。當然你如果把所有的預設屬性配置寫到建表語句裡,也不會錯,只是等價於上面的DEMO版。

1.row format行列分割符,預設是行是\n分割,欄位分隔符為ascii碼的控制符\001(即Ctrl+A)

如上面表,my_tmp,執行插入資料:
   insert into  table my_tmp  select 102,"jack" from aaaa limit1
然後資料插入後通過hadoop命令將表中資料檔案下載到本地
   hadoop  fs -get /user/hive/warehouse/fdm_sor.db/tmp_ids/*  ./
最後開啟的結果如下:
   102jack

  如下,windows下檢視:這就是hive預設欄位分隔符\001的顯示情況,可讀性差。

            

     2.預設儲存格式TextFILE儲存格式,hive常用的有三種儲存格式,具體參考我的其他部落格篇,TEXTFILE儲存格式內容可讀性好,沒有加密。

            

     3.預設內部表(管理表)都是預設hive資料倉庫路徑下庫名+表明的儲存路徑。

     4.TBLPROPERTIES,使用者可以在此新增一些關於表的描述,系統也會自動生成一些資訊,如表建立時間

建表方式二:定義分隔符和分割槽

      自定義分割槽和自定義行間欄位分隔符(若要自定義行分隔符,要重寫INPUTFORMAT和outputformat類。)

hive (fdm_sor)> create table my_merge(
              > ids string ,
              > curtermspastdue string)
              > PARTITIONED BY (
              >   `statis_date` string) 
              > ROW FORMAT DELIMITED FIELDSTERMINATED BY ',' ;

hive (fdm_sor)> show create tablemy_merge;

CREATE TABLE `my_merge`(
 `ids` string,
 `curtermspastdue` string)
PARTITIONED BY (
 `statis_date` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY','
STORED AS INPUTFORMAT
 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
 'hdfs://SuningHadoop2/user/finance/hive/warehouse/fdm_sor.db/my_merge'
TBLPROPERTIES (
 'transient_lastDdlTime'='1522135917')

注意:分割槽一定要寫在row format之前,否則報錯。這裡自定義的列的分割符是‘,’,無法直接定義行的分割符,如果要定義行要重寫INPUTFORMAT和outputformat類。這裡使用的資料儲存格式還是預設的TEXTFILE。注意下系統show create table後建表語句的變化。

建表方式三 :自定義檔案儲存格式

hive (fdm_sor)> CREATE  TABLE `my_merge1`(
              >   `ids` string,
              >   `curtermspastdue` string)
              > PARTITIONED BY (
              >   `statis_date` string)
              > ROW FORMAT DELIMITED
              >   FIELDS TERMINATED BY ','
              > STORED AS RCFILE
              > TBLPROPERTIES (
              >   'transient_lastDdlTime'='1522135917',
              >   'author'='9527') ;

 注意:STORED AS RCFILE等價於下面這種寫法,底層會將STORED AS RCFILE轉換成如下格式。

 STORED AS INPUTFORMAT
 'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
 OUTPUTFORMAT
 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
hive (fdm_sor)> SHOW CREATE TABLEMY_MERGE1;
CREATE TABLE `MY_MERGE1`(
 `ids` string,
 `curtermspastdue` string)
PARTITIONED BY (
 `statis_date` string)
ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ','
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/my_merge1'
TBLPROPERTIES (
 'author'='9527',
 'transient_lastDdlTime'='1522136172')

像這種stored as rcfile儲存的檔案,其實 

建表方式四:自定義檔案儲存位置

hive (fdm_sor)> CREATE  TABLE `my_merge2`(
              >   `ids` string,
              >   `curtermspastdue` string)
              > PARTITIONED BY (
              >   `statis_date` string)
              > ROW FORMAT DELIMITED
              >   FIELDS TERMINATED BY ','
              > STORED AS RCFILE
              >LOCATION  'hdfs://SuningHadoop2/user/finance/hive/warehouse/fdm_sor.db/1111111111111'

注意,一般外部表建立時要定義儲存位置location,但是管理表一般都會預設有儲存位置,但是預設雖有,使用者也可以自定義儲存位置,只是儲存位置沒有外部表定義的那麼隨意。

建表方式5:使用自定義儲存格式建表

add jar /home/bigdata/software/hive/ext-lib/suning-hive-inputformat.jar;
CREATE TABLE fdm_ssa.ssa_lbsadmprd1_T_ORDER
(ID BIGINT  commet'id,唯一標誌',
ORDER_NO STRING  comment'序號',
PRODUCT_ID BIGINT,
PERIOD_ID BIGINT,
CUST_SERVICE_REMARK STRING,
ACTIVE STRING,
CREATED_TIME STRING,
UPDATED_TIME STRING
)partitioned by( statis_date string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
STORED AS
 INPUTFORMAT
'com.suning.hive.input.CommonTextInputFormat' 
OUTPUTFORMAT 
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

日常開發實際建表格式:

1.表要有註釋,沒有註釋的表後續無法維護

2.表要有固定的命名規則,符合公司的命名規則

3.資料儲存切分格式要符合公司要求,比如這裡資料倉庫的複製層使用的就是自定義儲存個。SOR層儲存格式則是RCFILE.

下面才是符合公司規範的建表格式:

1.資料倉庫複製層SSA層建表格式;
add jar /home/bigdata/software/hive/ext-lib/suning-hive-inputformat.jar;
create table fdm_ssa.ssa_cpl_tb_repay_detail_d
(
 ID              varchar(50)      comment 'ID'        
,LOAN_NO         varchar(50)      comment '借據號'
,TOTAL_AMOUNT    decimal(16,4)    comment '總金額'
,PRINCIPAL       decimal(16,4)    comment '本金'
,INTEREST        decimal(16,4)    comment '利息'
,AMERCE          decimal(16,4)    comment '罰息'
,REPAY_TIME      varchar(30)      comment '還款時間'
,STATUS          VARCHAR(10)      comment '{狀態{100:申請中,200:還款成功,500:還款失敗,505:失效}}'
)comment '還款明細表'
partitioned by (stat_date varchar(8) COMMENT '時間分割槽欄位{"FORMAT":"YYYYMMDD"}')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
STORED AS INPUTFORMAT 
  'com.suning.hive.input.CommonTextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

2.資料倉庫庫第二層SOR,儲存格式為RCFILE
CREATE TABLE IF NOT EXISTS FDM_SOR.SOR_EVT_ICSS_T_INS_PREMIUM_PAY(
 ID                               bigint             COMMENT 'ID'
,CHANNEL_PAY_NO                   VARCHAR(32)        COMMENT '渠道支付號'
,CHANNEL_ORDER_NO                 VARCHAR(32)        COMMENT '渠道訂單號'
,POLICY_NO                        VARCHAR(32)        COMMENT '保單號'
,ETL_TIME                         varchar(19)        COMMENT 'ETL時間{"FORMAT":"yyyy-MM-dd HH:mm:ss"}'
,ETL_UPDATE_TIME                  varchar(19)        COMMENT 'ETL時間{"FORMAT":"yyyy-MM-dd HH:mm:ss"}'
)comment '保費支付表'
STORED AS RCFILE;