廊坊网站搭建,生活家装饰,本地网站做不大,建设视频网站需要什么知识1#xff0c;复杂类型
解决问题#xff1a;一些不容易获取到的数据#xff0c;例如数组类型#xff0c;集合类型等#xff0c;获取他们的数据
-- 1.创建表
create table tb_array_person(name string,city_array arraystring
)row format delimited
fields term…1复杂类型
解决问题一些不容易获取到的数据例如数组类型集合类型等获取他们的数据
-- 1.创建表
create table tb_array_person(name string,city_array arraystring
)row format delimited
fields terminated by \t
collection items terminated by ,;-- 2.上传数据到hdfs对应的表下
-- 3.查询数据结果
select * from tb_array_person;1当设定了复杂数据类型的字段后需要给字段指定分隔符之外还需要指定其他分隔符 2注意当使用原生数据类型指定字段名类型无法满足需求时就可以考虑使用复杂数据类型。
1.1 SerDe机制
所谓SerDe就是单词Serializer、Deserializer的简称。而Serializer表示序列化Deserializer为反序列化。 1序列化是对象(或数据)转化为字节码的过程相当于加密
2反序列化是字节码转换为对象(或数据)的过程好比是解密 而上述问题中的[collection items terminated by “,”]就表示拥有了SerDe语法。可以通过命令查看
desc formatted 表名;2这个序列化类中一共包含4种子语法分别用于指定不同内容的分隔符号4种语法分别是
[row format delimited]
[fields terminated by 指定分隔符] # 字段之间分隔符
[collection items terminated by 指定分隔符] # 集合/数组元素之间分隔符
[map keys terminated by 指定分隔符] # Map映射K-V之间分隔符
[lines terminated by 指定分隔符] # 行数据之间分隔符1一般情况下使用复杂类型时要设定collection、map分隔符
2fields字段、collection items集合/数组、map keys Map映射这几个使用较常见
1.2array数组
create [external] table 表名(字段名 字段类型 [comment 注释],字段名 字段类型 [comment 注释],...字段名 array类型
)
[row format delimited]
[fields terminated by 指定分隔符] # 字段之间分隔符
[collection items terminated by 指定分隔符]; # 集合/数组元素之间分隔符array类型属于集合/数组设定分隔符用collection items。 1数组变量名[index]
以索引值形式访问数组的某元素。其中index表示索引值索引值从0开始计算。
2size(数组变量名)
获取数组变量的总长度或元素总个数。
3array_contains(数组变量名, value)
判断value值是否存在数组变量中。若存在则返回true否则返回false。
create table complex_array(name string,location_lists arraystring
)row format delimited
fields terminated by \t
collection items terminated by ,;load data local inpath /root/day09_hive/array/01-data_for_array_type.txt into table complex_array;select * from complex_array;
selectname,location_lists[0]
from complex_array;
selectname,size(location_lists)
from complex_array;selectname,array_contains(location_lists,shenzhen)
from complex_array;selectname,array_contains(location_lists,beijing)
from complex_array;select*
from complex_array
where array_contains(location_lists,beijing); -- 做条件array类型 数组元素之间的分隔符collection items terminated by ‘分隔符’
1.3struct集合
在Hive中以struct类型对结构字段之间设定分隔符的建表语句
create [external] table 表名(字段名 字段类型 [comment 注释],字段名 字段类型 [comment 注释],...字段名 struct子列名 类型, 子列名 类型, ...
)
[row format delimited]
[fields terminated by 指定分隔符] # 字段之间分隔符
[collection items terminated by 指定分隔符]; # 集合/数组元素之间分隔符struct值得形式是key:value的形式
create table complex_struct(id int,informations structname:string, age:int
)row format delimited
fields terminated by #
collection items terminated by :;load data inpath /itheima/02-data_for_struct_type.txt into table complex_struct;select * from complex_struct;selectid,informations.name,informations.age
from complex_struct;structname:string, age:int结构分隔符只需要COLLECTION ITEMS TERMINATED BY ‘分隔符’
1.4map映射
在Hive中以map类型对映射字段之间设定分隔符的建表语句
create [external] table 表名(字段名 字段类型 [comment 注释],字段名 字段类型 [comment 注释],...字段名 mapkey类型, value类型
)
[row format delimited]
[fields terminated by 指定分隔符] # 字段之间分隔符
[collection items terminated by 指定分隔符] # 集合/数组元素之间分隔符
[map keys terminated by 指定分隔符]; # Map映射K-V之间分隔符map类型属于Map映射设定分隔符用map keys。 1变量名[key]
以key键访问map映射的值。其中key表示指定类型的键。
2map_keys(变量名)
以数组形式返回Map变量的所有键。
3map_values(变量名)
以数组形式返回Map变量的所有值。
4array_contains(数组变量名, value)
判断value值是否存在数组变量中可作为where条件处理。若存在则返回true否则返回false
create table complex_map(id int,name string,members mapstring, string,age int
)row format delimited
fields terminated by ,
collection items terminated by #
map keys terminated by :;select * from complex_map;select*,members[father],members[mother]
from complex_map;selectmap_keys(members)
from complex_map;selectmap_values(members)
from complex_map;select*
from complex_map
wherearray_contains(map_keys(members),brother);map类型的字段主要存储K-V键值对 操作mapkey类型, value类型时注意A不同键值对之间COLLECTION ITEMS TERMINATED BY ‘分隔符’ 分隔B一个键值对内使用MAP KEYS TERMINATED BY ‘分隔符’ 分隔K-V。
2.区别SQL的join查询
1全外连接
全外连接表示的是除了返回满足连接条件的记录外还会返回不满足连接条件的所有其它行记录可以说是左外连接和右外连接查询结果的总和。语法
select *|字段名, 字段名, ... from 左表 full outer join 右表 on 左右表关联条件;
通俗地说全外连接就是(左表有右表没有的null补全右表有左表没有的null补全)。
常用于合并显示所有数据内容。
2左半开连接
左半开连接LEFT SEMI JOIN会返回左边表的记录前提是其记录对于右边表满足 ON 语句中的判定条件。(可以理解成内连接后只取左表的数据)。
select 字段名 from A表名 别名 left semi join B表名 别名 on 条件 [where 查询条件];LEFT SEMI JOIN 比通常的 INNER JOIN 要更高效原因如下对于左表中一条指定的记录在右边表中一旦找到匹配的记录Hive 就会立即停止扫描。
select*
from tb_users u
full join tb_orders to on u.createTime to.createTime;select*
from tb_users u
left semi join tb_orders o on u.userido.userid;