定义格式如下:

create table tableName(
......
colName array<基本类型>
......
)说明:下标从0开始,越界不报错,以null代替

案例准备:

测试数据

zhangsan 78,89,92,96
lisi    67,75,83,94
王五  23,12
create table if not exists arr1(name string,scores array<string>
)
row format delimited
fields terminated by '\t'
stored as textfile ;
load data local inpath '/data/arr1.txt' into table arr1;
select * from arr1;

结果

+--------+---------------+
|name    |scores         |
+--------+---------------+
|zhangsan|["78,89,92,96"]|
|lisi    |["67,75,83,94"]|
|王五      |["23,12"]      |
+--------+---------------+
select scores[0] from arr1;

结果

+-----------+
|c0         |
+-----------+
|78,89,92,96|
|67,75,83,94|
|23,12      |
+-----------+

说明上面这种建表方式是不对的,应该用下面这种,还需要指定数组的分隔符

create table if not exists arr2
(name   string,scores array<String>
)row format delimitedfields terminated by '\t'collection items terminated by ','
;
load data local inpath '/data/arr1.txt' into table arr2;
select *
from arr2;

结果如下

+--------+---------------------+
|name    |scores               |
+--------+---------------------+
|zhangsan|["78","89","92","96"]|
|lisi    |["67","75","83","94"]|
|王五      |["23","12"]          |
+--------+---------------------+
select scores[0] from arr2;

结果

+--+
|c0|
+--+
|78|
|67|
|23|
+--+

查询语句:

select * from arr1;
select name,scores[1] from arr2 where size(scores) > 3;
+--------+--+
|name    |c1|
+--------+--+
|zhangsan|89|
|lisi    |75|
+--------+--+--统计arr2中的每个人的总成绩
select scores[0]+scores[1]+nvl(scores[2],0)+nvl(scores[3],0) from arr2;

想要一种效果:也就是将数组类型的数据元素展开,换句话说,就是列转行

zhangsan 78,89,92,96
lisi    67,75,83,94
王五  23,12
将上述效果转成下面的效果,更方便统计每个人的总成绩。
zhangsan        78
zhangsan        89
zhangsan        92
zhangsan        96
lisi    67
lisi    75
lisi    83
lisi    94
王五  23
王五  12

展开函数的使用

简介

- explode:展开函数(UDTF函数中的一种),作用是:接受一个数据行,然后返回产生多个数据行
- lateral view:虚拟表。会将UDTF函数生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行进行join来达到数据聚合的目的

案例:

select explode(score) score from arr2;
+---+
|col|
+---+
|78 |
|89 |
|92 |
|96 |
|67 |
|75 |
|83 |
|94 |
|23 |
|12 |
+---+select  name,cj from arr2 lateral view explode(scores) subview as cj;+--------+--+
|name    |cj|
+--------+--+
|zhangsan|78|
|zhangsan|89|
|zhangsan|92|
|zhangsan|96|
|lisi    |67|
|lisi    |75|
|lisi    |83|
|lisi    |94|
|王五      |23|
|王五      |12|
+--------+--+- 统计每个学生的总成绩:
select  name,sum(cj) from arr2 lateral view explode(scores) subview as cj
group by name;
+--------+---+
|name    |_c1|
+--------+---+
|lisi    |319|
|zhangsan|355|
|王五      |35 |
+--------+---+

还可以将展开的表创建一个新表

create table arr_tmp as
select  name,cj from arr2 lateral view explode(scores) subview as cj;

总结

  • array类型的数据在建表时要加一句
  • collection items terminated by ','
  • array类型的数据可以用explode结合lateral view展开

Hive复杂数据类型之array相关推荐

  1. hive复合数据类型之array

    概述 ARRAY:ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问.比如有一个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成 ...

  2. Hive复杂数据类型使用

    Hive复杂数据类型有Array.Map.Struct三种.下面介绍这三种复杂数据类型的使用方法. 1 Array类型 创建数据库 创建数据库 表,以 Array做为数据类型  查询数据库表  查询p ...

  3. hive 复杂数据类型 在数仓中应用(array、map、struct、和其组合应用)

    环境:一般宽表建表可能考虑存储更多信息选择复杂模型建设 复杂数据类型:array.map.struct 1.数组array,里边不能装不同类型的数据 more hive_array.txt zhang ...

  4. Hive学习笔记 —— Hive的数据类型

    Hive本质上是一个数据库,可以创建表,表有列组成,而列支持的主要类型有:基本数据类型.复杂数据类型.时间数据类型. 1. Hive的数据类型之基本数据类型 tinyint/smallint/int/ ...

  5. 【Hive】Hive的数据类型

    Hive中数据类型可以分为基本数据类型和复合数据类型.这些数据类型都是用Java实现的. 1. 基本数据类型 类型名称 描述 举例 boolean true/false true tinyint 1b ...

  6. bigint hive java类型_三十、Hive的数据类型以及常用的属性配置

    上篇文章我们在服务器上部署了Hive并将它的Metastore存储在了MySQL上,本文介绍一下Hive的数据类型以及常用的一些属性配置.关注专栏<破茧成蝶--大数据篇>,查看更多相关的内 ...

  7. 三十、Hive的数据类型以及常用的属性配置

    上篇文章我们在服务器上部署了Hive并将它的Metastore存储在了MySQL上,本文介绍一下Hive的数据类型以及常用的一些属性配置.关注专栏<破茧成蝶--大数据篇>,查看更多相关的内 ...

  8. linux hive查询数据类型,04-hive的数据类型

    转载请注明~ 在学习了Linux系统操作命令和shell编程之后,将进入到hive的学习中,先主要介绍hive的数据类型和文件格式. 01数据类型 基本数据类型 Hive 提供了基本数据类型和复杂数据 ...

  9. Hive读取复杂的数据类型(Array,Map,Struct)

    1.数组 数据文件 hive_array.txt,Array(1,2,3,4)  装的数据类型是一样的 zhnagsan PEK,SHA,HAK,NKG lisi CTU,CKG,XIY,CSX 创建 ...

最新文章

  1. Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收
  2. C/C++中使用函数memset对int型数组赋值(0,-1,max,min)
  3. Linq to XML的练习
  4. Go 语言能取代 Java,成为下一个 10 年的王者吗?
  5. 玩出花,只用文本就能干CV的活!
  6. 苹果又发布一个机器学习框架,帮自家生态里的开发者降低AI门槛
  7. Python格式化输出总结
  8. 惯性系统常用坐标系_惯性坐标系与非惯性坐标系
  9. html 中全角波浪线,中间波浪怎么打出来,靠上的波浪符号怎么打
  10. 华光职业学院计算机专业,关于给予张庆俊等同学省高校计算机一级 考试成绩优秀奖励的通知...
  11. emacs快捷键总结
  12. 你是外包,麻烦不要偷吃零食。。。网友:...
  13. 框架使用 - 收藏集 - 掘金
  14. 带上传文件功能的写CSDN博客并发表
  15. linux创建分区大小命令,Linux使用fdisk创建分区详解
  16. VMware Workstation 15界面,英文改中文
  17. C#网站图片下载器,网络爬虫,仅供学习参考使用,不可用于商业活动
  18. elk笔记20--Analysis
  19. 大数据学习系列(九)Hadoop1.X痛点分析及Hadoop2.X提出的解决方案
  20. 51单片机汇编学习笔记4——子函数

热门文章

  1. linux动态库路径生效,Linux下如何解决动态库的链接问题
  2. springboot报错Table 'wechat.hibernate_sequence' doesn't exist
  3. oracle缺少控制文件,关于oracle丢失控制文件的恢复办法
  4. 基于hadoop构建对象存储系统_基于Hadoop企业私有云存储平台的构建
  5. 企业微信小程序可用存储空间不足_微信小程序为什么能帮助企业商家引流?
  6. java exception 包_什么是Java中的异常包装?
  7. python 通用数据库类型_Python开发基础之Python常用的数据类型
  8. python操作linux命令行_python调用调用Linux命令
  9. 苹果x与苹果xs的区别_卡通与苹果Xs手机壳的完美邂逅,可爱气质萦绕指尖
  10. mysql limit (1-1)10_110,当您知道只有1个结果时,是否将'LIMIT 1'添加到MySQL查询中使它们更快?...