天天看點

maxcompute 2.0複雜資料類型之struct1. 含義2. 場景3. 玩轉struct4. 常見用法

1. 含義

類似于Java中的類的概念。包含很多類的屬性。

2. 場景

什麼樣的資料,适合使用struct類型來存儲呢?這裡列舉了幾個我在開發中實際用到的場景。

2.1 多個具有相同字首的字段

其實struct完全可以拆成多個字段。但是對于比較寬的表而言,會有如下特征:

(1)字段數很多,幾百個甚至更多;

(2)相近含義的字段,會放到相鄰的位置或者使用相同的字首,以便查找;

對于這種字段,可以考慮放到一個struct裡,減少表的字段數,更加友善查找。但是資料字典的維護,依然是比較麻煩的問題。

2.2 對象清單

對象有多種固定的屬性,簡單的key-value格式無法滿足,可以使用array嵌套struct的方式定義。減少了維護資料字典的工作量。

3. 玩轉struct

3.1 構造struct

3.1.1 struct

SELECT  STRUCT(4,'趙六','男') AS c;
           
c
{"col1":4,"col2":"趙六","col3":"男"}

在沒有指定struct内具體字段名的時候,預設為col1、col2、col3、……。是以取值的時候也是這樣取,如下:

SELECT  STRUCT(4,'趙六','男').col3 AS c;
           

3.1.2 named_struct

SELECT  NAMED_STRUCT('id',3,'name','王五','gender','男') AS c;           
{"id":3,"name":"王五","gender":"男"}

指定了struct内具體字段名,則named_struct的參數數量必須為偶數,分别是key1、value1、key2、value2、key3、value3、……。是以取值的時候也是這樣取,如下:

SELECT  NAMED_STRUCT('id',3,'name','王五','gender','男').gender AS c;           

3.2 橫縱雙向展開struct數組

例如現在有這樣一張表:

[{id:1, name:張三, gender:男}, {id:3, name:王五, gender:男}, {id:2, name:李四, gender:男}]

現在想橫向、縱向都展開,成多行多列格式,那麼就這樣做:

SELECT INLINE(c) FROM `test_table`;
           
id name gender
1 張三
3 王五
2 李四

但是這種做法自由度太低,是以很少會使用到。

4. 常見用法

  1. struct這種類型,更多的是應用在資料存儲上。不像array、map還會出現在複雜SQL的中間過程,用于做行列轉換等操作。
  2. struct作為表結構中的字段,可以單獨使用,或者是跟array聯用,來存儲數量不固定的對象資料。在建立表的時候,需要指定好struct内部的字段名、字段類型。
  3. struct大概是三個複雜類型之中,出場率最低的一個。絕大部分人都隻接觸過array和map,而幾乎沒使用過struct。

繼續閱讀