Hive建表语句相关浅析

建表语句如下:

--------------------------------LZO类型--------------------------------------
CREATE EXTERNAL TABLE app.app_aab_z1602_deliver_analysis(
shop_id bigint COMMENT ‘店铺编号’,
stat_ct bigint COMMENT ‘统计周期’,
stat_dt int COMMENT ‘统计时间’,
prvn_cd bigint COMMENT ‘省份代码’,
prvn_nm string COMMENT ‘省份名称’)
COMMENT ‘配送分析’
PARTITIONED BY (
dt string,
stat_ct_cd string)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’
WITH SERDEPROPERTIES (
‘field.delim’=’\t’,
‘escape.delim’=’\’,
‘serialization.null.format’=’’
) STORED AS INPUTFORMAT “com.hadoop.mapred.DeprecatedLzoTextInputFormat”
OUTPUTFORMAT “org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat”
LOCATION ‘hdfs://aws3/user/mart_aab/bi_aab/app.db/app_zs_z1602_deliver_analysis’
;
-------------------------------------ORC类型--------------------------------------
CREATE EXTERNAL TABLE adm.adm_m04_aab_kwd_lead_list_mid(
shop_typ_cd int COMMENT ‘商家类型’,
itm_id bigint COMMENT ‘商品ID’,
itm_nm string COMMENT ‘商品名称’,
srch_clck_num bigint COMMENT ‘搜索点击量’)
COMMENT ‘搜索点击表’
PARTITIONED BY (
dt string)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.ql.io.orc.OrcSerde’
WITH SERDEPROPERTIES (
‘field.delim’=’\t’,‘escape.delim’=’\n’,
‘serialization.null.format’=’’
) STORED AS orc
LOCATION ‘hdfs://aws3/user/mart_aab/bi_aab/adm.db/adm_m04_zs_kwd_lead_list_mid’
tblproperties(‘orc.compress’=‘SNAPPY’)
;

关于ROW FORMAT的解释说明

创建表的时候需要制定数据切分格式,就会用到row format关键字,hive官网是这样给出其用法的:
在这里插入图片描述

序列化是什么

序列化是对象转换为字节序列的过程。 反序列化是字节序列恢复为对象的过程。 对象的序列化主要有两种用途:对象的持久化,即把对象转换成字节序列后保存到文件中;对象数据的网络传送。 除了上面两点, hive的序列化的作用还包括:Hive的反序列化是对key/value反序列化成hive table的每个列的值。Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。

SerDe是序列化/反序列化的简写形式

SerDe说明hive如何去处理一条记录,包括Serialize/Deserilize两个功能, Serialize把hive使用的java object转换成能写入hdfs的字节序列,或者其他系统能识别的流文件。Deserilize把字符串或者二进制流转换成hive能识别的java object对象。比如:select语句会用到Serialize对象, 把hdfs数据解析出来;insert语句会使用Deserilize,数据写入hdfs系统,需要把数据序列化。

语法 stored as sequencefile 的替代方式是指定INPUTFORMAT 为 org.apache.hadoop.mapred.SequenceFileInputFormat,并指定OUTPUTFORMAT 为org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat.(二者的缩写)

对于转义符的理解(参考借鉴)

WITH SERDEPROPERTIES (
‘field.delim’=’\t’,       
‘escape.delim’=’\’,
‘serialization.null.format’=’’ (null 值 ‘’ 表示)
)

demo1,表中有两个字段,myWorld.txt内容:

Song “2” 6666
Wang “2” 6666
没有转义,那么两个“都会当作字段分隔符,查询结果是:
Song 2
Wang 2
给表加上了转义符\【‘escape.delim’=’\’, 】,\后面的字符会被转义,直接跳过,如果是分隔符就不会被当做分隔符,查询结果:
Song 2" 6666
Wang 2" 6666

demo2,表有两个字段,ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘"’; 原始表内容:

yourworld.txt 内容:
Song"2"666"1314
Wang"2"666"1314
输出
Song 2
Wang 2
ALTER TABLE yourworld SET SERDEPROPERTIES (‘serialization.last.column.takes.rest’ = ‘true’);
serialization.last.column.takes.rest 的意思是最后一个字段的内容是否包含那些多余的数据: select * from yourworld;
Song 2"666"1314
Wang 2"666"1314

hive只支持单字节的分隔符,LazyStruct、LazySimpleSerDe里面可以看到hive如何序列化、反序列化的过程。

你可能感兴趣的:(Hive技术点,hive,建表语句,转义符号)