100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 大数据仓库 Hive复杂的数据结构 SQL列转行操作

大数据仓库 Hive复杂的数据结构 SQL列转行操作

时间:2021-07-19 23:04:40

相关推荐

大数据仓库 Hive复杂的数据结构 SQL列转行操作

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<name:string,country:string>,

array_colarray<string>,

map_colmap<stringstring,string>,

union_colmap<STRING,array<STRING>>

)

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<string,array<string>>中key对应的value值

selectunion_col["jinri"]fromcomplex;

--查询复杂结构map<string,array<string>>中key对应的value值(数组)中的第一个元素

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

110

220

330

440

200

260

370

480

转换成下面的数据格式

yearmth1mth2mth3mth4

10203040

50607080

转换操作

selectyear,

sum(CASEmonthwhen"1"thenamountELSE0END)mth1,

sum(CASEmonthwhen"2"thenamountELSE0END)mth2,

sum(CASEmonthwhen"3"thenamountELSE0END)mth3,

sum(CASEmonthwhen"4"thenamountELSE0END)mth4

fromtempgroupbyyear

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。