写点什么

hive 学习笔记之二:复杂数据类型,我的腾讯 Java 面试经历分享

作者:MySQL神话
  • 2021 年 11 月 27 日
  • 本文字数:2363 字

    阅读完需:约 8 分钟

  1. 查看全部数据:


hive> select * from t2;


OK


t2.person t2.friends


tom ["tom_friend_0","tom_friend_1","tom_friend_2"]


jerry ["jerry_friend_0","jerry_friend_1","jerry_friend_2","jerry_friend_3","jerry_friend_4","jerry_friend_5"]


Time taken: 0.052 seconds, Fetched: 2 row(s)


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


  1. 查询 friends 中的某个元素的 SQL:


select person, friends[0], friends[3] from t2;


执行结果如下,第一条记录没有 friends[3],显示为 NULL:


hive> select person, friends[0], friends[3] from t2;


OK


person _c1 _c2


tom tom_friend_0 NULL


jerry jerry_friend_0 jerry_friend_3


Time taken: 0.052 seconds, Fetched: 2 row(s)


  1. 数组元素中是否包含某值的 SQL:


select person, array_contains(friends, 'tom_friend_0') from t2;


执行结果如下,第一条记录 friends 数组中有 tom_friend_0,显示为 true,第二条记录不包含,就显示 false:


hive> select person, array_contains(friends, 'tom_friend_0') from t2;


OK


person _c1


tom true


jerry false


Time taken: 0.061 seconds, Fetched: 2 row(s)


  1. 第一条记录的 friends 数组中有三个元素,借助 LATERAL VIEW 语法可以把这三个元素拆成三行,SQL 如下:


select t.person, single_friend


from (


select person, friends


from t2 where person='tom'


) t LATERAL VIEW explode(t.friends) v as single_friend;


执行结果如下,可见数组中的每个元素都能拆成单独一行:


OK


t.person single_friend


tom tom_friend_0


tom tom_friend_1


tom tom_friend_2


Time taken: 0.058 seconds, Fetched: 3 row(s)


  • 以上就是数组的基本操作,接下来是键值对;

MAP,建表,导入数据

  • 接下来打算创建名为 t3 的表,只有 person 和 address 两个字段,person 是字符串类型,address 是 MAP 类型,通过文本文件导入数据时,对分隔符的定义如下:


  1. person 和 address 之间的分隔符是竖线;

  2. address 内部有多个键值对,它们的分隔符是逗号;

  3. 而每个键值对的键和值的分隔符是冒号;


  • 满足上述要求的建表语句如下所示:


create table if not exists t3(


person string,


address map<string, string>


)


row format delimited


fields terminated by '|'


collection items terminated by ','


map keys terminated by ':';


  • 创建文本文件 003.txt,可见用了三种分隔符来分隔字段、MAP 中的多个元素、每个元素键和值:


tom|province:guangdong,city:shenzhen


jerry|province:jiangsu,city:nanjing


  • 导入 003.txt 的数据到 t3 表:


load data local inpath '/home/hadoop/temp/202010/25/003.txt' into table t3;

MAP,查询

  1. 查看全部数据:


hive> select * from t3;


OK


t3.person t3.address


tom {"province":"guangdong","city":"shenzhen"}


jerry {"province":"jiangsu","city":"nanjing"}


Time taken: 0.075 seconds, Fetched: 2 row(s)


  1. 查看 MAP 中的某个 key,语法是 field[“xxx”]:


hive> select person, address["province"] from t3;


OK


person _c1


tom guangdong


jerry jiangsu


Time taken: 0.075 seconds, Fetched: 2 row(s)


  1. 使用 if 函数,下面的 SQL 是判断 address 字段中是否有"street"键,如果有就显示对应的值,没有就显示 filed street not exists:


select person,


if(address['street'] is null, "filed street not exists", address['street'])


from t3;


输出如下,由于 address 字段只有 province 和 city 两个键,因此会显示 filed street not exists:


OK


tom filed street not exists


jerry filed street not exists


Time taken: 0.087 seconds, Fetched: 2 row(s)


  1. 使用 explode 将 address 字段的每个键值对展示成一行:


hive> select explode(address) from t3;


OK


province guangdong


city shenzhen


province jiangsu


city nanjing


Time taken: 0.081 seconds, Fetched: 4 row(s)


  1. 上面的 explode 函数只能展示 address 字段,如果还要展示其他字段就要继续 LATERAL VIEW 语法,如下,可见前面的数组展开为一个字段,MAP 展开为两个字段,分别是 key 和 value:


select t.person, address_key, address_value


from (


select person, address


from t3 where person='tom'


) t LATERAL VIEW explode(t.address) v as address_key, address_value;


结果如下:


OK


tom province guangdong


tom city shenzhen


Time taken: 0.118 seconds, Fetched: 2 row(s)


  1. size 函数可以查看 MAP 中键值对的数量:


hive> select person, size(address) from t3;


OK


tom 2


jerry 2


Time taken: 0.082 seconds, Fetched: 2 row(s)

STRUCT

  1. STRUCT 是一种记录类型,它封装了一个命名的字段集合,里面有很多属性,新建名为 t4 的表,其 info 字段就是 STRUCT 类型,里面有 age 和 city 两个属性,person 和 info 之间的分隔符是竖线,info 内部的多个元素之间的分隔符是逗号,注意声明分隔符的语法:


create table if not exists t4(


person string,


info struct<age:int, city:string>


)


row format delimited


fields terminated by '|'


collection items terminated by ',';


  1. 准备好名为 004.txt 的文本文件,内容如下:


tom|11,shenzhen


jerry|12,nanjing


  1. 加载 004.txt 的数据到 t4 表:


load data local inpath '/home/hadoop/temp/202010/25/004.txt' into table t4;


  1. 查看 t4 的所有数据:


hive> select * from t4;


OK


tom {"age":11,"city":"shenzhen"}


jerry {"age":12,"city":"nanjing"}


Time taken: 0.063 seconds, Fetched: 2 row(s)


  1. 查看指定字段,用 filedname.xxx 语法:

Docker 步步实践

目录文档:




①Docker 简介


②基本概念


③安装 Docker



④使用镜像:



⑤操作容器:



⑥访问仓库:



⑦数据管理:



⑧使用网络:



⑨高级网络配置:



⑩安全:



?底层实现:



?其他项目:



本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
hive学习笔记之二:复杂数据类型,我的腾讯Java面试经历分享