Hive中创建表的各种方式以及区别详解

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

建表方式一:demo级建表

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

查看建表语句(工作中经常使用的语句)

hive (fdm_sor)> show create tablemy_tmp;   


 
 
  1. CREATE TABLE `my_tmp`(
  2. `id` int,
  3. `ids` string)
  4. ROW FORMAT SERDE
  5. 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
  6. STOREDAS INPUTFORMAT
  7. 'org.apache.hadoop.mapred.TextInputFormat'
  8. OUTPUTFORMAT
  9. 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  10. LOCATION
  11. 'hdfs://Hadoop2/user/finance/hive/warehouse/fdm_sor.db/my_tmp'
  12. TBLPROPERTIES (
  13. 'transient_lastDdlTime'= '1522135161')

    可以看出实际上在hive底层建表默认了很多属性(比如反引号的使用),用户可以选择自定义,也可以选择默认。当然你如果把所有的默认属性配置写到建表语句里,也不会错,只是等价于上面的DEMO版。

1.row format行列分割符,默认是行是\n分割,字段分隔符为ascii码的控制符\001(即Ctrl+A)


 
 
  1. 如上面表,my_tmp,执行插入数据:
  2. insert into table my_tmp select 102, "jack" from aaaa limit1
  3. 然后数据插入后通过hadoop命令将表中数据文件下载到本地
  4. hadoop fs - get / user/hive/warehouse/fdm_sor.db/tmp_ids /* ./
  5. 最后打开的结果如下:
  6. 102jack

  如下,windows下查看:这就是hive默认字段分隔符\001的显示情况,可读性差。

            

     2.默认存储格式TextFILE存储格式,hive常用的有三种存储格式,具体参考我的其他博客篇,TEXTFILE存储格式内容可读性好,没有加密。

            

     3.默认内部表(管理表)都是默认hive数据仓库路径下库名+表明的存储路径。

     4.TBLPROPERTIES,用户可以在此添加一些关于表的描述,系统也会自动生成一些信息,如表创建时间

建表方式二:定义分隔符和分区

      自定义分区和自定义行间字段分隔符(若要自定义行分隔符,要重写INPUTFORMAT和outputformat类。)


 
 
  1. hive (fdm_sor)> create table my_merge(
  2. > ids string ,
  3. > curtermspastdue string)
  4. > PARTITIONED BY (
  5. > `statis_date` string)
  6. > ROW FORMAT DELIMITED FIELDSTERMINATED BY ',' ;

hive (fdm_sor)> show create tablemy_merge;


 
 
  1. CREATE TABLE `my_merge`(
  2. `ids` string,
  3. `curtermspastdue` string)
  4. PARTITIONED BY (
  5. `statis_date` string)
  6. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
  7. STORED AS INPUTFORMAT
  8. 'org.apache.hadoop.mapred.TextInputFormat'
  9. OUTPUTFORMAT
  10. 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  11. LOCATION
  12. 'hdfs://SuningHadoop2/user/finance/hive/warehouse/fdm_sor.db/my_merge'
  13. TBLPROPERTIES (
  14. 'transient_lastDdlTime'= '1522135917')

注意:分区一定要写在row format之前,否则报错。这里自定义的列的分割符是‘,’,无法直接定义行的分割符,如果要定义行要重写INPUTFORMAT和outputformat类。这里使用的数据存储格式还是默认的TEXTFILE。注意下系统show create table后建表语句的变化。

建表方式三 :自定义文件存储格式


 
 
  1. hive (fdm_sor)> CREATE TABLE `my_merge1`(
  2. > `ids` string,
  3. > `curtermspastdue` string)
  4. > PARTITIONED BY (
  5. > `statis_date` string)
  6. > ROW FORMAT DELIMITED
  7. > FIELDS TERMINATED BY ','
  8. > STORED AS RCFILE
  9. > TBLPROPERTIES (
  10. > 'transient_lastDdlTime'= '1522135917',
  11. > 'author'= '9527') ;

 注意:STORED AS RCFILE等价于下面这种写法,底层会将STORED AS RCFILE转换成如下格式。


 
 
  1. STORED AS INPUTFORMAT
  2. 'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
  3. OUTPUTFORMAT
  4. 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'

 
 
  1. hive (fdm_sor)> SHOW CREATE TABLEMY_MERGE1;
  2. CREATE TABLE `MY_MERGE1`(
  3. `ids` string,
  4. `curtermspastdue` string)
  5. PARTITIONED BY (
  6. `statis_date` string)
  7. ROW FORMAT DELIMITED
  8. FIELDS TERMINATED BY ','
  9. STORED AS INPUTFORMAT
  10. 'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
  11. OUTPUTFORMAT
  12. 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
  13. LOCATION
  14. 'hdfs://SuningHadoop2/user/finance/hive/warehouse/fdm_sor.db/my_merge1'
  15. TBLPROPERTIES (
  16. 'author'= '9527',
  17. 'transient_lastDdlTime'= '1522136172')

像这种stored as rcfile存储的文件。具体关于hive常见的文件存储格式参考后续博客

建表方式四:自定义文件存储位置


 
 
  1. hive (fdm_sor)> CREATE TABLE `my_merge2`(
  2. > `ids` string,
  3. > `curtermspastdue` string)
  4. > PARTITIONED BY (
  5. > `statis_date` string)
  6. > ROW FORMAT DELIMITED
  7. > FIELDS TERMINATED BY ','
  8. > STORED AS RCFILE
  9. >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. 1.数据仓库复制层SSA层建表格式;
  2. add jar /home/bigdata/software/hive/ext-lib/suning-hive-inputformat.jar;
  3. create table fdm_ssa.ssa_cpl_tb_repay_detail_d
  4. (
  5. ID varchar( 50) comment 'ID'
  6. ,LOAN_NO varchar( 50) comment '借据号'
  7. ,TOTAL_AMOUNT decimal( 16, 4) comment '总金额'
  8. ,PRINCIPAL decimal( 16, 4) comment '本金'
  9. ,INTEREST decimal( 16, 4) comment '利息'
  10. ,AMERCE decimal( 16, 4) comment '罚息'
  11. ,REPAY_TIME varchar( 30) comment '还款时间'
  12. , STATUS VARCHAR( 10) comment '{状态{100:申请中,200:还款成功,500:还款失败,505:失效}}'
  13. ) comment '还款明细表'
  14. partitioned by (stat_date varchar( 8) COMMENT '时间分区字段{"FORMAT":"YYYYMMDD"}')
  15. ROW FORMAT SERDE
  16. 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
  17. STORED AS INPUTFORMAT
  18. 'com.suning.hive.input.CommonTextInputFormat'
  19. OUTPUTFORMAT
  20. 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
  21. 2.数据仓库库第二层SOR,存储格式为RCFILE
  22. CREATE TABLE IF NOT EXISTS FDM_SOR.SOR_EVT_ICSS_T_INS_PREMIUM_PAY(
  23. ID bigint COMMENT 'ID'
  24. ,CHANNEL_PAY_NO VARCHAR( 32) COMMENT '渠道支付号'
  25. ,CHANNEL_ORDER_NO VARCHAR( 32) COMMENT '渠道订单号'
  26. ,POLICY_NO VARCHAR( 32) COMMENT '保单号'
  27. ,ETL_TIME varchar( 19) COMMENT 'ETL时间{"FORMAT":"yyyy-MM-dd HH:mm:ss"}'
  28. ,ETL_UPDATE_TIME varchar( 19) COMMENT 'ETL时间{"FORMAT":"yyyy-MM-dd HH:mm:ss"}'
  29. ) comment '保费支付表'
  30. STORED AS RCFILE;

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值