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

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.rhkb.cn/news/200444.html

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

相关文章

HarmonyOS ArkTSTabs组件的使用(六)

Tabs组件的使用 ArkUI开发框架提供了一种页签容器组件Tabs&#xff0c;开发者通过Tabs组件可以很容易的实现内容视图的切换。页签容器Tabs的形式多种多样&#xff0c;不同的页面设计页签不一样&#xff0c;可以把页签设置在底部、顶部或者侧边。 Tabs组件的简单使用 Tabs组件…

网络参考模型与标准协议(二)-TCP/IP对等模型详细介绍

应用层 应用层为应用软件提供接口&#xff0c;使应用程序能够使用网络服务。应用层协议会指定使用相应的传输层协议&#xff0c;以及传输层所使用的端口等。TCP/IP每一层都让数据得以通过网络进行传输&#xff0c;这些层之间使用PDU ( Paket Data Unit,协议数据单元)彼此交换信…

局域网文件共享神器:Landrop

文章目录 前言解决方案Landrop软件界面手机打开效果 软件操作 前言 平常为了方便传文件&#xff0c;我们都是使用微信或者QQ等聊天软件&#xff0c;互传文件。这样传输有两个问题&#xff1a; 必须登录微信或者QQ聊天软件。手机传电脑还有网页版微信&#xff0c;电脑传手机比…

gitlab 实战

一.安装依赖 yum install -y curl policycoreutils-python openssh-server perl 二.安装gitlab yum install gitlab-jh-16.0.3-jh.0.el7.x86_64.rpm 三.修改下面的 vim /etc/gitlab/gitlab.rbexternal_url http://192.168.249.156 四.初始化 gitlab-ctl reconfigure 五.查看状…

OpenStack-train版安装之环境准备

环境准备 环境介绍VMware配置WMware虚拟机最低配置WMware添加网卡WMware添加硬盘 基础环境安装修改各节点的主机名修改各节点的hosts文件修改各节点的内核参数关闭各节点的防火墙和selinux安装NPT&#xff08;时间同步&#xff09;安装OpenStack基础服务包 CentOS升级内核 环境…

C++ Qt 学习(九):模型视图代理

1. Qt 模型视图代理 Qt 模型视图代理&#xff0c;也可以称为 MVD 模式 模型(model)、视图(view)、代理(delegate)主要用来显示编辑数据 1.1 模型 模型 (Model) 是视图与原始数据之间的接口 原始数据可以是&#xff1a;数据库的一个数据表、内存中的一个 StringList&#xff…

集合的自反关系和对称关系

集合的自反关系和对称关系 一&#xff1a;集合的自反关系1&#xff1a;原理&#xff1a;2&#xff1a;代码实现 二&#xff1a;对称关系1&#xff1a;原理&#xff1a;2&#xff1a;代码实现 三&#xff1a;总结 一&#xff1a;集合的自反关系 1&#xff1a;原理&#xff1a; …

简单但好用:4种Selenium截图方法了解一下!

前言 我们执行UI自动化操作时&#xff0c;大多数时间都是不在现场的&#xff0c;出现错误时&#xff0c;没有办法第一时间查看到&#xff0c;这时我们可以通过截图当时出错的场景保存下来&#xff0c;后面进行查看报错的原因&#xff0c;Selenium中提供了几种截图的方法&#x…

OpenAI 董事会与 Sam Altman 讨论重返 CEO 岗位事宜

The Verge 援引多位知情人士消息称&#xff0c;OpenAI 董事会正在与 Sam Altman 讨论他重新担任首席执行官的可能性。 有一位知情人士表示&#xff0c;Altman 对于回归公司一事的态度暧昧&#xff0c;尤其是在他没有任何提前通知的情况下被解雇后。他希望对公司的治理模式进行重…

hisi芯片常见专有名词总结SVP MPP NNIE ACL

1.SVP&#xff1a; Smart Vision Platform是海思媒体处理芯片智能视觉异构加速平台。该平台包含了 CPU、DSP、NNIE(Neural Network Inference Engine)等多个硬件处理单元和运行在这些 硬件上 SDK 开发环境&#xff0c;以及配套的工具链开发环境。 不同芯片下的 SVP 硬件资源…

趣学python编程(七、实现个小网站如此简单 web.py使用介绍)

这里先拿一个小网站的例子来举例&#xff0c;保持好奇心就可以了。因为兴趣才是最好的老师&#xff0c;它能激发人内在的行动力。这里介绍个使用web.py轻量级框架实现的一个小网站&#xff0c;可以看到实现个小网站并不难。python都能用来干什么&#xff1f;那么网站就是它众多…

武汉站--ChatGPT/GPT4科研技术应用与AI绘图及论文高效写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

执行npm的时候报权限问题的解决方案

我们在执行npm操作的过程中&#xff0c;会出现以下权限问题&#xff0c;解决方案: 管理员身份 运行cmd 切换目录到要执行命令的文件下 再进行npm操作即可

idea一键打包docker镜像并推送远程harbor仓库的方法(包含spotify和fabric8两种方法)--全网唯一正确,秒杀99%水文

我看了很多关于idea一键打包docker镜像并推送harbor仓库的文章&#xff0c;不论国内国外的&#xff0c;基本上99%都是瞎写的&#xff0c; 这些人不清楚打包插件原理&#xff0c;然后就是复制粘贴一大篇&#xff0c;写了一堆垃圾&#xff0c;然后别人拿来也不能用。 然后这篇文…

下厨房网站月度最佳栏目菜谱数据获取及分析PLus

目录 概要 源数据获取 写Python代码爬取数据 Scala介绍与数据处理 1.Sacla介绍 2.Scala数据处理流程 数据可视化 最终大屏效果 小结 概要 本文的主题是获取下厨房网站月度最佳栏目近十年数据&#xff0c;最终进行数据清洗、处理后生成所需的数据库表&#xff0c;最终进…

丐版设备互联方案:安卓linux互联局域网投屏,文件共享,共享剪切板

华为&#xff0c;苹果&#xff0c;甚至小米最近也推出了澎湃&#xff2f;&#xff33;&#xff0c;发现实在是太方便了&#xff0c;当然这些对硬件&#xff0c;系统的要求还是比较高&#xff0c;我用的主力机是小米&#xff11;&#xff12;pro和ubuntu&#xff0c;win双系统也…

Tomcat 9.0.54源码环境搭建

一. 问什么要学习tomcat tomcat是目前非常流行的web容器&#xff0c;其性能和稳定性也是非常出色的&#xff0c;学习其框架设计和底层的实现&#xff0c;不管是使用、性能调优&#xff0c;还是应用框架设计方面&#xff0c;肯定会有很大的帮助 二. 运行源码 1.下载源…

PyTorch中并行训练的几种方式

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

dump备份命令

dump备份文件系统&#xff0c;或者目录 文件系统有等级划分&#xff0c;0为全部备份&#xff0c;1.针对上一次有变动的文件进行备份&#xff0c;以此类崔 目录备份&#xff1a;只有一个等级0&#xff0c; 针对文件系统类型有要求ext2&#xff0c;ext3&#xff0c;如果是其他…

pygame播放视频并实现音视频同步

一、前言 在我接触pygame时最新的pygame已经不支持movie模块&#xff0c;这就导致在pygame播放视频变成一个问题&#xff0c;网上搜了下解决方案有两个&#xff1a; 一是使用opencv播放视频&#xff0c;再结合pygame.mixer来播放音频 二是使用moviepy播放视频&#xff0c;再…