1. 程式人生 > >大資料(十八):Hive元資料配置、常見屬性配置、資料型別與資料轉換

大資料(十八):Hive元資料配置、常見屬性配置、資料型別與資料轉換

一、Hive元資料配置到MySQL當中

        為什麼要把Hive的元資料配置到MySql中?我們可以使用多個客戶端連線linux系統並且都嘗試啟動Hive,可以發現在啟動第二個Hive客戶端的時候發生報錯了。

        那是應為在預設的情況下,Hive元資料被儲存在內嵌的Derby資料庫中,只允許一個會話的連線。在開發的時候多人使用這個Hive的將會變得非常噁心。我們通過將元資料配置到MySQL中,讓其支援多個會話的連線。

1.安裝MySQL,參考網站:https://blog.csdn.net/qq_17776287/article/details/53536761

2.下載mysql對應的連線驅動包。

3.將下載好的mysql連線驅動上傳到/usr/local/hive/lib資料夾下(hive目錄下的lib資料夾裡)

4.在/usr/local/hive/conf(hive目錄下的conf資料夾裡)目錄下建立一個hive-site.xml檔案

5.根據官方文件的配置引數,拷貝資料到hive-site.xml檔案中

官方文件:https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

具體配置如下(對應的地方改成你自己的配置):

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://{mysql所在伺服器的host}:{mysql連線埠}/{資料庫名稱}?createDatabaseIfNotExist=true</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>{mysql使用者名稱}</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>{mysql使用者密碼}</value>
    </property>
</configuration>

6.配置完畢後,如果啟動hive異常,可以重新啟動一下機器。(重啟後別忘記啟動hadoop叢集)

 

二、hive常用互動命令引數

-help:幫助命令

-e:不進入hive的互動視窗執行SQL語句,例如:hive -e "select id from student;"

-f:執行指令碼檔案中的sql語句,例如:hive -f /opt/sql/hivef.sql

執行檔案中的sql語句並將結果寫入檔案中,hive -f opt/sql/hivef.sql > /opt/sql/hive_result.txt

 

三、hive其他的命令操作

1.在hive cli命令視窗中使用hdfs檔案系統命令

例如:檢視hdfs檔案系統:dfs -ls /;

2.在在hive cli命令視窗中使用本地檔案系統命令

例如:檢視linux下檔案系統:! ls /;

3.檢視hive中輸入的所有歷史命令

進入~目錄下,“.hivehistory”檔案中存放著歷史命令

 

四、Hive常見屬性配置

1.hive資料倉庫位置配置

  1. Default資料倉庫的最原始位置是hdfs上的:/user/hive/warehouse路徑下

  2. 在倉庫目錄下,沒有對預設的資料庫default建立資料夾。如果某張表屬於default資料庫,直接在資料倉庫目錄下建立一個資料夾。

  3. 修改default資料倉庫原始位置(在hive-site.xml中修改)

<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>{新的位置}</value>
</property>

2.顯示當前資料庫名稱和查詢表的表頭資訊

在hive-site.xml中新增如下資訊

<property>
    <name>hive.cli.print.header</name>
    <value>true</value>
</property>
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
</property>

修改之後效果如下:

3.Hive執行日誌資訊配置

  1. hive的log預設存放在/tmp/{當前使用者名稱}/hive.log目錄下

  2. 修改hive的log存放日誌到/usr/local/hive/logs

    1. 修改/usr/local/hive/conf/hive-log4j.properties.template檔名稱為hive-log4j.properties

    2. 在hive-log4j.properties檔案中修改log存放位置

hive.log.dir=/usr/local/hive/logs

 

四、引數配置方式

1.檢視當前配置資訊

hive客戶端中輸入set命令

2.引數配置的三種方式

  1. 配置檔案配置

    預設的配置檔案:hive-default.xml

    使用者自定義配置檔案:hive-site.xml (需要直接新建檔案)

    使用者自定義的配置會覆蓋掉預設配置。另外,hive也會讀取Hadoop的配置,hive是作為Hadoop的客戶端啟動的,hive的配置會覆蓋掉hadoop的配置。配置檔案的設定對所有本機啟動的hive程序都起效。

  2. 命令列引數設定

    例如:啟動hive是,在命令列新增-hiveconf param=value來設定引數,hive -hiveconf mapred.reduce.tasks=10;

    僅對本次hive啟動有效

  3. 引數宣告方式

    可以在HQL中使用set關鍵字設定引數,set mapred.reduce.tasks=10;

    僅對本次hive啟動有效

上述三種設定方式的優先順序依次遞增。配置檔案<命令列引數<引數宣告。注意某些系統級的引數,例如log4j相關的設定,必須用前兩種方式設定,這些引數的讀取在會話建立之前就完成了。

 

五、Hive資料型別

1.基本資料型別

Hive資料型別

Java資料型別

長度

TINYINT

byte

1byte有符號整數

SMALINT

short

2byte有符號整數

INT

int

4byte有符號整數

BIGINT

long

8byte有符號整數

BOOLEAN

boolean

布林型,true或者false

FLOAT

float

單精度浮點型

DOUBLE

double

雙精度浮點型

STRING

string

字串

TIMESTAMP

 

時間型別

BINART

 

位元組陣列

對於hive的String型別響度與資料庫的varchar型別,這個型別是一個可變的字串,不過他不能宣告其中最多能儲存多少個字元,理論上它可以儲存2GB的字元數

2.集合資料型別

資料型別

描述

STRUCT

和C語言中的struct類似,都可以通過“點”符號訪問元素類容

Map

Map是一組鍵值對元組集合,使用陣列表示法可以訪問資料。

ARRAY

陣列是一組具有相同型別和名稱的變數集合。

Hive有三種複雜資料型別ARRAY、MAP和STRUCT。ARRAY和MAP與java中的array和map相似,二struct與c語言中的Struct類似,他封裝了一個命名欄位集合,複雜資料型別執行任意層次的巢狀。

 

六、資料型別例項

1.假設某表有如下一行,我們用JSON格式來表示其資料結構。在Hive下訪問的格式為

{
  "name": "songsong",
  "friends": ["bingbing" , "lili"] ,      //列表Array,
  "children": {                     //鍵值Map,
      "xiao song": 18 ,
      "xiaoxiao song": 19
  }
  "address": {                     //結構Struct,
      "street": "hui long guan" ,
      "city": "beijing"
  }
}

2.基於上述資料結構,我們在Hive裡建立對應的表,並匯入資料。

建立本地測試檔案test.txt

songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing

3. Hive上建立測試表test

create table test(
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';

4.匯入文字資料到測試表(hive客戶端中執行)

load data local inpath '/{檔案路徑}/test.txt' into table test;

5.訪問三種集合列裡的資料,以下分別是ARRAY,MAP,STRUCT的訪問方式

select friends[1],children['xiao song'],address.city from test where name="songsong";

 

七、資料型別轉換

        Hive的原子資料型別是可以進行隱式轉換的,類似於Java的型別轉換,例如某表示式使用INT型別,TINYINT會自動轉換為INT型別,但是Hive不會進行反向轉化,例如,某表示式使用TINYINT型別,INT不會自動轉換為TINYINT型別,它會返回錯誤,除非使用CAST 操作。

1.隱式型別轉換規則如下。

  1. 任何整數型別都可以隱式地轉換為一個範圍更廣的型別,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。

  2. 所有整數型別、FLOAT和STRING型別都可以隱式地轉換成DOUBLE。

  3. TINYINT、SMALLINT、INT都可以轉換為FLOAT。

  4. BOOLEAN型別不可以轉換為任何其它的型別。

2.可以使用CAST操作顯示進行資料型別轉換,例如CAST('1' AS INT)將把字串'1' 轉換成整數1;如果強制型別轉換失敗,如執行CAST('X' AS INT),表示式返回空值 NULL。