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列舉它被用來存放固定的不可改變的型別,比如說,四...