Hive SQL DDL语法 - 指定分隔符、指定存储路径

本文详细介绍了HiveSQL的DDL建表语句,包括原生和复杂数据类型的使用,以及SerDe在数据序列化和反序列化中的作用。Hive的读写文件流程涉及InputFormat和OutputFormat,而SerDe如LazySimpleSerDe则处理字段分隔符。此外,文章还提到了如何自定义分隔符和使用如JSON等复杂格式的数据,以及如何指定数据的HDFS存储路径。
摘要由CSDN通过智能技术生成

Hive SQL DDL建表语法树

  • “[]”中的语法可选
  • “|”表示使用时,语法需要二选一
  • 建表语句中语法顺序要和语法树规则保持一直
  • 整体分为原生数据类型和复杂数据类型
  • 原生数据类型包括:数值类型、字符串类型、时间日期类型、杂项数据类型。
  • 复杂数据类型包括:array数组、map映射、struct结构、union联合体。
CREATE [TEMPORARY][EXTERNAL] TABLE [IF NOT EXISTS][db_name.]table_name
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type[COMMENT col_comment],...)]
[CLUSTERED BY (col_name,col_name,...)[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_format]
[LOCATION hdfs_path]
[TBLPROPERTIES(property_name=property_value,...)];

SerDe是什么

  • 是Serializer、Deserializer的简称
  • 目的是序列化和反序列化
  • 序列化时对象转化为字节码的过程,反序列化时字节码转换为对象的过程
  • Hive使用SerDe读取和写入表行对象

Hive读写文件流程

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

SerDe相关语法

ROW FORMAT DELIMITED|SERDE
  • DELIMITED表示使用默认的LazySimpleSerDe类来处理数据
  • 可以使用ROW FORMAT SERDE serde_name指定其他SerDe类来处理数据,甚至支持用户自定义类

LazySimpleSerDe指定分隔符

  • LazySimpleSerDe包含四种子语法,用于指定字段之间、集合元素之间、map映射kv之间、换行的分隔符号。
ROW FORMAT DELIMITED
			[FIELDS TERMINATED BY char]           #字符之间分隔符
			[COLLECTION ITEMS TERMINATED BY char] #集合元素之间分隔符
			[MAP KEYS TERMINATED BY char]         #Map映射kv之间分隔符
			[LINES TERMINATED BY char]            #行数据之间分隔符

SERDE处理数据(如json)

ROW FORMAT SERDE ser_name
	[WITH SERDEPROPERTIES
		(property_name=property_value,
		 property_name=proberty_value,..)]

Hive默认分隔符

  • Hive建表时若没有row format指定分隔符,则采用默认分隔符;
  • 默认分隔符是\001使用的是ASCLL编码的值。

指定存储路径

  • Hive建表时,可以通过location语法更改数据存储路径。
  • 对于已经生成好的数据文件,使用location指定路径会很方便。
LOCATION '<hdfs_location>'

案例

使用原生数据类型

  • 字段含义:id、name(英雄名称)、hp_max(最大生命)、attack_max(最高物攻)、defense_max(最大物防)、attack_range(攻击范围)、role_main(主要定位)、role_assist(次要定位)。
  • 字段之间分隔符为制表符。
--创建数据库并切换使用
CREATE DATABASE IF NOT EXISTS pljnb;
USE pljnb;
-- 创建表
CREATE TABLE t_archer(
	id INT COMMENT "ID",
	name STRING COMMENT "英雄名称",
	hp_max INT COMMENT "最大生命",
	mp_max INT COMMENT "最大法力",
	attack_max INT COMMENT "最高物攻",
	defense_max INT COMMENT "最大物防",
	attack_range STRING COMMENT "攻击范围",
	role_main STRING COMMENT "主要定位",
	role_assist STRING COMMENT "次要定位"
)COMMENT "王者荣耀射手信息"
ROW FORMAT DELIMITED
FIELDS TERMINATED BY "\t";

使用复杂数据类型

  • 字段:id、name(英雄名称)、win_rate(胜率)、skin_price(皮肤及价格);
  • 需要指定字段之间分隔符、集合元素之间分隔符、map kv之间分隔符。
CREATE TABLE t_hot_hero_skin_price(
	id INT,
	name STRING,
	win_rate INT,
	skin_price MAP<STRING,INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' --字段间分隔符
COLLECTION ITEMS TERMINATED BY '-' --集合元素之间分隔符
MAP KEYS TERMINATED BY ':'; --集合元素kv之间分隔符

使用默认分隔符

  • 字段:id、team_name(战队名称)、ace_player_name(王牌选手名字)
  • 数据都是原生数据类型,且字段之间分隔符是\001,则建表时可以不指定分隔符。
CREATE TABLE t_team_ace_player(
	id INT,
	team_name STRING,
	ace_player_name STRING
);

指定数据存储路径

  • 使用location关键字指定路径表在hdfs上的存储路径
CREATE TABLE t_team_ace_player_location(
	id INT,
	team_name STRING,
	ace_player_name STRING
)
LOCATION '/data'; --使用location关键字指定路径表在hdfs上的存储路径
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值