Hive常用的數據類型概述


              Hive常用的數據類型概述

                           作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

一.基本數據類型

Hive數據類型

對應Java數據類型

長度(數據取值范圍)

備注

 TINYINT

byte

1 byte有符號(即最高位為"符號位",下同)整數(取值范圍為:-128~127)

 

 SMALINT

short

2 byte有符號整數(取值范圍為: -32768~32767) 

 

 INT  

int

4 byte有符號整數(取值范圍為: -2147483648~2147483647)

 

 BIGINT

long

8 byte有符號整數(取值范圍為: -9223372036854775808~9223372036854775807) 

 

 BOOLEAN

boolean

布爾類型(取值范圍:true,false) 

 

 FLOAT

float

4 byte的單精度浮點數(1位符號位,8位指數,23位小數) 

其中小數部分(2 ** 23)對應最大的十進制數字為:8388608,這是一個7位十進制數字。

可惜呀,這個數字要比9999999小,因此為了百分百保證精度,我們通常說float精度可以保證十進制的6位運算。

 DOUBLE

double

8 byte的雙精度浮點數(1位符號位,11位指數,52位小數) 

其中小數部分(2 ** 52)對應最大的十進制數字為:4503599627370496,這是一個16位十進制數字。

同理,這個數字要比9999999999999999小,因此為了百分百保證精度,我們通常說double精度可以保證十進制的15位運算。

 STRING

string

可以使用單引號('')或者雙引號("")定義字符串,他是一個字符集合。

  當然,關於字符集合自然會設計到字符編碼問題喲~ 

 TIMESTAMP

 

 時間類型

 

 BINARY

 

字節數組 

 

 

  溫馨提示: 
    對於Hive的String類型相當於MySQL數據庫的varchar類型,該類型是一個可變的字符串。不過它不能聲明其中最多能存儲多少個字符,但理論上它可以存儲2GB的字符數。
    在Java編程中,如果double類型都無法表示的精度,可以使用java中的BigDecimal類型,它能支持跟高精度的運算喲~

 

二.集合數據類型 

  Hive有三種復雜數據類型ARRAY、MAP和STRUCT。如下所示:
    ARRAY:
      數組是一組具有相同類型和名稱的變量的集合。這些變量稱為數組的元素,每個數組元素都有一個編號,編號從零開始。與Java中的Array類似。
    MAP: 
      MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。與Java中的Map類似。
    STRUCT:
      和c語言中的struct類似,都可以通過“點”符號訪問元素內容。

  接下來我們來一起看一個案例,來體會一下這三種復雜數據類型。

1>. 假設某表有如下兩行,我們用JSON格式來表示其數據結構(注釋內容為Hive中的訪問格式)

{
    "name": "曹操",
    "friends": ["荀彧" , "典韋"] ,  //列表Array, 
    "children": {  //鍵值Map,
        "曹昂": 30,
        "曹丕": 25,
     "曹彰":22,
     "曹沖":18

    }
    "address": {  //結構Struct,
        "street": "丞相府" ,
        "city": "許昌" 
    }
},
{
    "name": "劉備",
    "friends": ["諸葛亮" , "龐統"] ,  //列表Array, 
    "children": {  //鍵值Map,
        "劉禪": 25,
        "劉永": 20,
     "劉理":15
    }
    "address": {  //結構Struct,
        "street": "武擔山",
        "city": "成都" 
    }
},
...

2>.基於上述數據結構,我們在Hive里創建對應的表,並導入數據。

[root@hadoop105.yinzhengjie.com ~]# vim sanguo.txt
[root@hadoop105.yinzhengjie.com ~]# 
[root@hadoop105.yinzhengjie.com ~]# cat sanguo.txt
曹操,荀彧_典韋,曹昂_:30_曹丕:25_曹彰:22_曹沖:18,丞相府_許昌
劉備,諸葛亮_龐統,劉禪:25_劉永:20_劉理:15,武擔山_成都
[root@hadoop105.yinzhengjie.com ~]# 


溫馨提示:
  MAP,STRUCT和ARRAY里的元素間關系都可以用同一個字符表示,這里用"_"

3>.Hive上創建測試表(sanguo)

create table sanguo(
  name string,
  friends array<string>,
  children map<string, int>,
  address struct<street:string, city:string>
)
row format delimited 
  fields terminated by ','
  collection items terminated by '_'
  map keys terminated by ':'
  lines terminated by '\n';



行格式定義(row format delimited)參數含義如下所示:
  fields terminated by ','
    指定列分隔符。
  collection items terminated by '_'      
    指定MAP STRUCT 和 ARRAY 的分隔符(數據分割符號)
  map keys terminated by ':' 
    指定MAP中的key與value的分隔符
  lines terminated by '\n';                    
    指定行分隔符,若不指定,則默認為"\n"。

4>.導入文本數據到測試表

load data local inpath '/root/sanguo.txt' into table sanguo;

5>.訪問三種集合列里的數據,以下分別是ARRAY,MAP,STRUCT的訪問方式

select * from sanguo;
select friends[1],children['劉禪'],address.city from sanguo where name="劉備";
select friends[1],children['曹丕'],address.city from sanguo where name="曹操";

 

三.類型轉換

1>.類型轉換概述

  Hive的原子數據類型(其實就是基礎數據類型)是可以進行隱式轉換的。

  類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換為INT類型。

  但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換為TINYINT類型,它會返回錯誤,除非使用CAST操作進行強制類型轉換。

  綜上所述,隱式類型轉換我們稱為自動類型轉換,它可以從小的范圍轉換到大的范圍。強制類型轉換則是從大的類型范圍轉換為小的類型范圍(可能存在數據丟失的風險)。

2>.隱式類型轉換規則

  隱式類型轉換規則如下所示:
    (1)任何整數類型都可以隱式地轉換為一個范圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。
    (2)所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。
    (3)TINYINTSMALLINT、INT都可以轉換為FLOAT。
    (4)BOOLEAN類型不可以轉換為任何其它的類型。

3>.強制類型轉換(可以使用CAST操作顯示進行數據類型轉換)

SELECT "100" + 25;  // 這里會自動發生類型轉換,將字符串類型轉換成DOUBLE類型。
SELECT CAST("100" AS INT) + 25;  // 這里我們將字符串類型轉換為INT類型。 
SELECT CAST("10AF" AS INT);  // 當類型轉換失敗時會返回NULL。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM