Hive複雜資料型別之array

2021-10-13 03:33:06 字數 4375 閱讀 6597

create

table tablename(..

....

colname array《基本型別》..

....

)說明:下標從0開始,越界不報錯,以null代替

測試資料

zhangsan	78,89

,92,96

lisi 67,75

,83,94

王五 23

,12

create

table

ifnot

exists arr1(

name string,

scores array

)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

ifnot

exists arr2

( name string,

scores array

)row format delimited

fields

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;

hive複雜資料型別 a29

一 map struct array 這3種的用法 1 array的使用 建立資料庫表,以array作為資料型別 create table person name string,work locations array row format delimited fields terminated b...

複雜資料型別

1 在c語言中,除了之前學到的基本資料型別 整型,浮點型,字元型 外,還有指標型別和構造型別 結構型,聯合型,列舉型 2 結構體型別,用於把不同型別的資料組合成乙個集合體,宣告格式 struct 結構名 例如 includestruct students void main 結構體的特點是 表示更豐...

複雜資料型別

1結構體 相當於是高階語言裡的類,但是他沒有方法,也就是行為,只有屬性,也就是成員,結構體相當於是自定義類 宣告struct students 當我們需要使用結要用結構體裡的類的屬性時,我們需要通過 運算子來進行呼叫,比如 students.age 2列舉它被用來存放固定的不可改變的型別,比如說,四...