复杂类型,查询--学习笔记

1,复杂类型

解决问题:一些不容易获取到的数据,例如数组类型,集合类型等,获取他们的数据

-- 1.创建表
create table tb_array_person(name string,city_array array<string>
)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分隔符;

(2)fields字段、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开始计算。

2,size(数组变量名)

获取数组变量的总长度或元素总个数。

3,array_contains(数组变量名, value)

判断value值是否存在数组变量中。若存在,则返回true;否则返回false。

create table complex_array(name string,location_lists array<string>
)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 struct<name: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;

struct<name:string, age:int>结构分隔符只需要:COLLECTION ITEMS TERMINATED BY ‘分隔符’;

1.4map映射

在Hive中,以map类型对映射字段之间设定分隔符的建表语句:

create [external] table 表名(字段名 字段类型 [comment '注释'],字段名 字段类型 [comment '注释'],...字段名 map<key类型, 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表示指定类型的键。

2,map_keys(变量名)

以数组形式返回Map变量的所有键。

3,map_values(变量名)

以数组形式返回Map变量的所有值。

4,array_contains(数组变量名, value)

判断value值是否存在数组变量中,可作为where条件处理。若存在,则返回true;否则返回false

create table complex_map(id int,name string,members map<string, 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键值对;
操作map<key类型, 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.userid=o.userid;

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/193851.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让你彻底学会HBase

让你彻底学会HBase Apache HBase&#xff08;Hadoop DataBase&#xff09;是一个开源的、高可靠性、高性能、面向列&#xff08;这里指列族&#xff0c;非列式存储&#xff09;、可伸缩、实时读写的分布式数据库。利用 Hadoop HDFS 作为其文件存储系统&#xff0c;利用 ZooKee…

图片降噪软件 Topaz DeNoise AI mac中文版功能

Topaz DeNoise AI for Mac是一款专业的Mac图片降噪软件。如果你有噪点的相片&#xff0c;可以通过AI智能的方式来处理掉噪点&#xff0c;让照片的噪点降到最 低。有了Topaz DeNoise AI mac版处理图片更方便&#xff0c;更简单。 Topaz DeNoise AI mac软件功能 无任何预约即可在…

基于寄生捕食算法优化概率神经网络PNN的分类预测 - 附代码

基于寄生捕食算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于寄生捕食算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于寄生捕食优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

【Linux】21、软中断、网络小包、SYN FLOOD 攻击、sar tcpdump

文章目录 一、通俗理解&#xff1a;从“取外卖”看中断二、软中断2.1 网卡收发数据包2.2 查看软中断和内核线程2.3 案例2.3.1 案例&#xff1a;动态库 sleep 导致软中断2.3.2 Nginx 进程的不可中断状态是系统的一种保护机制&#xff0c;可以保证硬件的交互过程不被意外打断。所…

vue2中的插槽

vue2中的插槽 props[数学公式]属性: 各种数据类型值。子组件接收到之后做不同的判断实现不同的效果来实现复用性。 插槽&#xff1a;HTML dom元素。 预留属性、预留插槽。 调用语法&#xff1a;单闭合/双闭合。需要传插槽&#xff0c;就用双闭合&#xff1b;不需要就单双都可以…

【飞控调试】DJIF450机架+Pixhawk6c mini+v1.13.3固件+好盈Platinium 40A电调无人机调试

1 背景 由于使用了一种新的航电设备组合&#xff0c;在调试无人机起飞的时候遇到了之前没有遇到的问题。之前用的飞控&#xff08;Pixhawk 6c&#xff09;和电调&#xff08;Hobbywing X-Rotor 40A&#xff09;&#xff0c;在QGC里按默认参数配置来基本就能平稳飞行&#xff0…

基于阿基米德优化算法优化概率神经网络PNN的分类预测 - 附代码

基于阿基米德优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于阿基米德优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于阿基米德优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

list,dict使用方法

list, dict的使用 list的使用&#xff1a; ori_list [1, 2, 3] append: 使用append为列表增加1个元素4 输出增加元素之后的列表 ori_list [1, 2, 3] ori_list.append(4) print(ori_list)extend: 给定列表[8, 7, 6],将ori_list和给定的列表进行合并 输出合并后的列表 ori_l…

【数据结构算法(一)】递归篇(常见实例讲解)

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; ⭐本篇讲解实例&#xff1a; 斐波那契、兔子问题、猴子吃桃问题、跳台阶问题、汉诺塔、杨辉三角 ⭐用到的递归思想&#xff1a; 无记忆递归、记忆递归(重点掌握) 目录 一、斐波那契&#xff1a; ①无记忆多路递归&am…

【文末附资料链接】2023年第十三届亚太杯数学建模竞赛(APMCM)优秀参考论文思路指导(持续更新中ing)

一、赛事介绍 数学建模作为一门跨学科的科学&#xff0c;不仅需要对数学知识的熟练掌握&#xff0c;还需要对实际问题的深刻理解和解决问题的创新思维。亚太杯数学建模竞赛旨在激发青年学子的创造力和团队协作精神&#xff0c;培养其在实际问题中运用数学方法解决现实挑战的能力…

基于吉萨金字塔建造算法优化概率神经网络PNN的分类预测 - 附代码

基于吉萨金字塔建造算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于吉萨金字塔建造算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于吉萨金字塔建造优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&a…

PL/SQL编程

一、Oracle常用函数 concat&#xff1a;用于连接两个字符串。 CONCAT(Oraok, .com) -- Result: Oraok.com ceil&#xff1a;小数点向上取整。 secect ceil(7.3) from dual --Result: 8 dual表是oracle系统为计算设计的一张临时表 select sysdate as 系统日期 from dual…