Hive SQL DDL建表语法

1. 完整语法树

	//HIVE DDL CREATE TABLE
	create[temporary][external]table[if not exists][db_name.]table_name
	[(col_name data_type[comment col_conmment],...)]
	[comment table_comment]
	[partitioned by(col_name col_type[comment col_comment],...)]
	[clustered by(col_name col_type,...)[sorted by (col_name[ASC|DESC],...)]into num_buckets buckets]
	[row format delimited|serde serde_name with serdeproperties (property_name=property_value,...)]
	[stored as file_foramt]
	[location hdfs_path]
	[tblproperties(property_name=property_value,...)];

2. Hive数据类型

Hive数据类型指的是表中列的字段类型,整体分为两类:原生数据类型(primitive data type)和复杂数据类型(compliex data type)。原生数据类型包括:数值类型、时间日期类型、字符串类型、杂项数据类型;复杂数据类型包括:array数组,map映射,struct结构、union联合体。
在这里插入图片描述
在这里插入图片描述
注意事项:

  1. Hive SQL中,数据类型英文字母大小写不敏感;
  2. 除SQL数据类型外,还支持Java数据类型,比如字符串String;
  3. 复杂数据类型的使用通常需要和分隔符指定语法配合使用;
  4. 如果定义的数据类型和文件不一致,Hive会尝试隐式转换,但是不保证成功。
  5. HQL支持隐式和显示转换,原生类型从窄类型到宽类型称为隐式转换,反之则不允许。
  6. 显示转换使用CAST函数。CAST('100' as INT)会将100字符串转换为100整数值。

3. ROW FORMAT

3.1 SerDe

  • SerDe是Serializer、Deserializer的简称,即序列化和反序列化。
  • 序列化是将对象转换为字节码的过程,反序列化是字节码转换为对象的过程。
  • Hive使用SerDe(包括FileFormat)读取和写入表行对象,需要注意的是,key部分在读取时会被忽略,而且写入时key始终是常数。基本上行对象存储在value中。

3.2 Hive读写文件流程

读: 首先调用InputFormat(默认TextInputFormat),返回一条条kv键值对记录(默认是一行对应一条键值对)。然后调用SerDe(默认LazySimpleSerDe)的Deserializer将一条条记录中的value根据分隔符切分为各个字段。
写: 将Row写入文件时,首先调用SerDe(默认LazySimpleSerDe)的Serializer将对象转换成字节序列,然后调用OutputFormat将数据写入HDFS文件中。

3.3 相关语法

  • ROW FOEMAT是语法关键字,delimited和serde二选一。
  • 使用delimited表示使用默认的LazySimpleSerDe类来处理数据。
  • 如果数据文件格式比较特殊,可以使用[ROW FORAMT SERDE serde_name]指定其他的Serde类来处理数据,支持用户自定义SerDe。
  • 建表时如果没有row format语法指定分隔符,则采用默认分隔符’\001’,使用ASCII二进制编码值为:0000 0001。
    在这里插入图片描述

4. LOCATION

Hive的默认存储路径是${Hive_HOME}/conf/hive-site.xml配置文件的hive.metastore.dir属性指定,默认值是/usr/hive/warehouse。建表时使用LOCATION语法来更改数据在HDFS上的路径:LOCATION '<hdfs_locaiton>'

5. 案例

5.1 原生数据类型使用

//学生表
	create table student(
		id int comment"ID",
		name string comment"名字"
)comment "学生表"
row format delimited
	fields terminated by "\t";//以tab键为分割符

5.2 复杂数据类型使用

//学生成绩表
	create table score(
	id int,
	name string,
	mark map<string,int>  --map复杂类型
)
row format delimited //如果没有该语句,则使用默认分隔符'\001'
	fields terminated by ',' --指定字段之间分隔符
	collection items terminated by '-' --指定集合元素之间的分隔符
	map keys terminated by ':' --指定map元素KV之间的分隔符 

5.2 指定存储路径

//教师表
	create table teacher(
		id int,
		name string,		
)
	location '/data'; --使用location关键字在“根目录”下的data里建表,从HiveUI页面可以查看。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值