hive是大数据仓库,最常用的一种用作离线分析的数据仓库。Hive 使用类SQL 查询语法, 最大限度的实现了和SQL标准的兼容,大大降低了传统数据分析人员处理大数据的难度。同时他使用JDBC 接口/ODBC接口,开发人员更易开发应用,使不会编程的人员也能快速上手Hive操作,进行数据分析。
HIve的复杂数据类型
1,STRUCT
struct类似于java的类变量使用,Hive中定义的struct类型也可以使用点来访问。从文件加载数据时,文件里的数据分隔符要和建表指定的一致。例如:struct(val1, val2, val3, ...) ,只有字段值。
2,ARRAY
array表示一组相同数据类型的集合,下标从零开始,可以用下标访问。例如:arr[0]
3,MAP
map是一组键值对的组合,可以通过key访问value,键值之间同样要在创建表时指定分隔符。
例如:map_col["name"]
当然Hive除了支持STRUCT、ARRAY、MAP这些原生集合类型,还支持集合的组合。注意:Hive不支持集合里再组合多个集合。
HIve复杂数据结构的用法
1,模仿Oracle数据库操作,构建dual表。
createtabledual(idint);
insertintotabledualvalues(1);
insertintotabledualvalues(2);
2,创建带有复合结构的表。
createtablecomplex(
idint,
struct_colstruct
array_colarray
map_colmap
union_colmap
)
ROWFORMATDELIMITEDFIELDSTERMINATEDBY","
COLLECTIONITEMSTERMINATEDBY"-"
MAPKEYSTERMINATEDBY":";
注意上文建表语句下面三行的用法:
--这个子句表明hive使用字符‘,’作为列分隔符。
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
--这个子句表明hive使用字符‘-’作为集合元素间分隔符(一个字段各个item的分隔符)。
COLLECTION ITEMS TERMINATED BY "-"
--这个子句表明hive使用字符作为map的键和值之间分隔符。
MAP KEYS TERMINATED BY ":"
3,插入数据,使用insert .... select语法插入数据。
插入数据
insertoverwritetablecomplex
select
id,
named_struct("name","toutiao","wukong","wd")asstruct_col,
array("12","21","13")asarray_col,
map("jinri","toutiao")asmap_col,
map("jinri",array("12","21","13"))asunion_col
fromdual;
4,使用HQL语句进行查询。
-查询struct
selectstruct_col.namefromcomplex;
--查询数组第一个元素
selectarray_col[0]fromcomplex;
--查询map中key对应的value值
selectmap_col["jinri"]fromcomplex;
--查询复杂结构map
selectunion_col["jinri"]fromcomplex;
--查询复杂结构map
selectunion_col["jinri"][0]fromcomplex;
SQL的列转行用法
1,先来了解一下case when then else end函数的用法
SELECT
case-------------如果
whensex="0"then"男"-------------sex="0",则返回值"男"
whensex="1"then"女"-------------sex="1",则返回值"女"
else2-------------其他的返回"其他’
end-------------结束
FROMstudent
---用法一:
select
case
whensex="0"then"男"
whensex="1"then"女"
else"其他"end
fromstudent
---用法二:
selectsex,
case
when"0"then"男"
when"1"then"女"
else"其他"end
fromstudent
2,列转行的用法
准备数据
yearmonthamount
2019110
2019220
2019330
2019440
2020150
2020260
2020370
2020480
转换成下面的数据格式
yearmth1mth2mth3mth4
201910203040
201950607080
转换操作
selectyear,
sum(CASEmonthwhen"1"thenamountELSE0END)mth1,
sum(CASEmonthwhen"2"thenamountELSE0END)mth2,
sum(CASEmonthwhen"3"thenamountELSE0END)mth3,
sum(CASEmonthwhen"4"thenamountELSE0END)mth4
fromtempgroupbyyear