1. 程式人生 > 其它 >Hive的基本概念和常用命令

Hive的基本概念和常用命令

一、概念:

1、結構化和非結構化資料

結構化資料:固有的鍵值對

非結構資料:沒有固定的鍵值對,沒有明確的對映關係

所以就可以理解下面這句話:hive是由facebook開源用於解決海量結構化日誌的資料統計專案。

2、Hive是基於Hadoop檔案系統上的資料倉庫架構,它為資料倉庫的管理提供了許多功能:資料ETL(抽取、轉換和載入)、資料儲存管理和大型資料集的查詢和分析能力。

RDBMS(關係型資料庫)

OLTP(聯機事務處理過程):一組事務同時去執行,低延遲,查詢為主。

ACID(原子性、一致性、隔離性、永續性)

OLAP(聯機分析處理過程):以資料倉庫為基礎,高延遲,分析為主。

3、Hive定義了類SQL語言-Hive QL(HQL),允許使用者進行和SQL相似的操作,它可以將結構化的資料檔案對映為一張資料表,並提供簡單的SQL查詢功能,同時允許開發人員方便的使用MR操作,可以將SQL語言轉換為MR任務執行。

二、官網:

三、ETL

E:Extract 資料抽取

T:Transform 資料轉換

L:Load資料裝載

ETL是將業務系統的資料經過抽取、清洗轉換之後,裝載到資料倉庫的過程。目的是將分散、零亂、標準不統一的資料整合到一起。例如專案日誌資訊、資料爬蟲資訊等。就可以提供決策分析依據了。

資料抽取:把不同的資料來源資料抓取過來,存到某個地方。

資料清洗:過濾哪些不符合要求的資料或修正資料之後再進行抽取。不完整資料:比如資訊缺失。錯誤資料:日期格式不正確、日期越界、字串出現空格等重複資料:需要去重等

資料轉換:不一致的資料進行轉換,比如一個職工有職工號和人事號,學生有身份證號和學號等

常見ETL工具:Oracle的OWB、SQL Server的DTS、SSIS服務、Informatic等等,工具可以快速建立起ETL工程,遮蔽了複雜的編碼任務、提高了速度,降低了難度,但是缺少靈活性。

SQL方法優點是靈活,提高了ETL效率,但是編碼複雜,對技術要求高。

Hive結合了前面兩種的優點。

四、安裝Hive

可參考之前安裝Hive的文件教程《CentOS6.5-Hadoop2.7.3安裝hive-2.1.1》。

也可以進入官網參考

找到Getting Started Guide

選擇Running Hive

五、常用命令

安裝完成後我們進入hive

在官網上有命令使用的文件

文件內容

我們使用一些命令:

檢視資料庫show databases;

建立資料庫show database 庫名

可以檢視HDFS上

使用資料庫use 庫名

建立表的資料型別,我們可以檢視官網

就可以找到所有的資料型別了

建立表的時候,如果欄位是關鍵字,則需要加反飄號`(Tab鍵上面)。

那關鍵字有哪些?

比如

報錯

FAILED: ParseException line 2:0 Failed to recognize predicate 'date'. Failed rule: 'identifier' in column specification

所以我們改為:

但是我們依然不建議使用關鍵字,儘量去避免,不要使用。我們修改下欄位名

這其中有兩個小細節:第一CTRL+L清屏 第二從記事本複製表語句的時候前面不要有空格,否則會報錯,Display all 528 possibilities? (y or n)。

我們再看資料載入

我們儘量不要使用insert、update、delete,我們可以使用load,所以我們點選load

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

如果加Local表示Linux本地的資料檔案

如果不加Local,表示HDFS上的資料檔案

我們在Linux上準備一個數據檔案

我們先載入資料

load data local inpath '/data/hivetest/stu_info_local' into table gjz_error;

我們檢視資料,資料全部是NULL,因為hive預設的分隔符是^A,也就是001,而我們的分隔符是一個tab鍵。

我們把分隔符改為^A(先按Ctrl+V,再按Ctrl+A)

然後我們重新匯入資料,發現數據已經匯入了

我們再將資料檔案上傳到HDFS上

建立資料表

我們匯入資料

此時我們檢視HDFS上,發現原來的資料也不在了

但是資料已經載入到hive了

另外資料檔案已經在新的目錄下了

所以不加local是剪下移動的過程,而加local是複製的過程。

前面的問題:如果我們的資料不是預設的分隔符,即不是^A該怎麼辦呢?

我們準備檔案

準備資料,將資料分隔符改為\t

我們看官網上這個部分

我們重新建表,加入資料

create table hive_table_local_format(

id int,

name string

)row format delimited fields terminated by '\t'

Hive在HDFS檔案系統上的結構

我們在test庫下面建立表

匯入資料

我們檢視

/user/hive/warehouse/test.db/hive_table_local_format

我們可以得到

元資料庫開始是derby,只能開啟一個客戶端,再開啟一個會話啟動會報錯,所以我們改變了元資料庫為Mysql,其中可選的是:

我們建立一個數據庫

create database stu_test

使用資料庫並建立表

我們準備一個論壇地圖資料檔案

將檔案上傳到HDFS上

我們先建立兩個目錄

我們把資料上傳

我們載入資料到hive中

在載入之前我們可以看到,我們看到stu_test中沒有資料

我們載入資料

我們再載入第二個資料

注:我們會發現,自動重新命名了。

我們檢視我們表的資訊:

  1. show create table
  2. desc [extended][formatted] table
  3. 元資料庫

或者

或者

或者

我們檢視Tals

修改表名

官網

我們修改一個表試一下

給表新增一個列

alter table table_name add columns (age int);

添加註釋也在這個部分

清除資料

Truncate table table_name

注意不會刪除元資料

Hive的日誌檔案配置檔案

目錄修改為hive.log.dir=/opt/bigdata/hive/logs

我們可以在hive-site.xml.template找到下面兩個屬性,這兩個屬性可以幫助我們在日誌中顯示資料和列名,將屬性新增到hive-site.xml中

<property>

<name>hive.cli.print.current.db</name>

<value>false</value>

<description>Whether to include the current database in the Hive prompt.</description>

</property>

<property>

<name>hive.cli.print.header</name>

<value>false</value>

<description>Whether to print the names of the columns in query output.</description>

</property>

我們新增到配置中,下次重啟進入就可以看到日誌了

一些常用的命令

官網的位置

就可以看到命令了

比如:

quit exit 退出客戶端

set 臨時設定屬性 可以參考Mysql中設定編碼等方式去理解。另外set也可以使用者檢視引數的屬性。

顯示所有函式show functions;

我們可以查詢函式的使用比如max

Desc function max;

Desc function extended case;

Hive可以用java寫成函式,使用add jar就可以新增使用

也可以將python指令碼新增進來,使用add file

!感嘆號的方式可以檢視Linux上的檔案

dfs方式可以檢視HDFS上的檔案