1. 程式人生 > >Hive的基本原理與應用

Hive的基本原理與應用

Hive的基本原理與使用

本文轉自:http://tiechou.info/?p=33

簡介

Hive是基於Hadoop構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料。Hive可以將結構化的資料儲存在資料倉庫中,通過自己的SQL去查詢分析需要的內容,這套SQL簡稱Hive SQL。它與關係型資料庫的SQL略有不同,但支援了絕大多數的語句如DDL、DML 以及常見的聚合函式、連線查詢、條件查詢。

Hive在Hadoop的架構體系中承擔了一個SQL解析的過程,它提供了對外的入口來獲取使用者的指令然後對指令進行分析,解析出一個MapReduce程式組成可執行計劃,並按照該計劃生成對應的MapReduce任務提交給Hadoop叢集處理,獲取最終的結果。
安裝

Hive需要Hadoop的支援,也就是說在安裝Hive之前需要正確安裝Hadoop。一般我們會將Hive安裝到NameNode所在主機上,這裡假設使用root使用者進行安裝,Hive的安裝過程很簡單,網上有很多安裝方式:

1 [[email protected]] # 去到hadoop的目錄,使用hadoop的專案根目錄
2 [[email protected]] cd /opt/hadoop
3 [[email protected]] # 下載專案包(去官網(http://hadoop.apache.org/)下載Hadoop專案)
4 [[email protected]
] wget http://www.apache.org/dist/hadoop/hive/hive-0.5.0/hive-0.5.0-dev.
tar.gz
5 [[email protected]] # 解壓
6 [[email protected]] tar xzvf hive-0.5.0-dev.tar.gz
7 [[email protected]] # 進入目錄
8 [[email protected]] cd hive-0.5.0-dev
9 [[email protected]] # 與Hadoop的安裝一樣,我們應該習慣性的將安裝目錄寫入環境變數
10 [[email protected]] export HIVE_HOME=`pwd`
11 [[email protected]] # 也可以將環境變數設定到/etc/profile中


配置

Hive的必要配置相當簡單,只需要宣告$HADOOP_HOME(請查閱《Hadoop安裝》文件)這個環境變數就行了。

Hive的核心配置檔案$HIVE_HOME/conf/hive-default.xml中有一些對Hive關鍵配置,一般我們不需要對期進行改動,如果你需要更改這個關鍵配置,請不要直接更改hive-default.xml這個檔案,在同一目錄下新建hive-site.xml檔案,然後將需要更改的屬性配置在這裡面即可,配置格式與hive-default.xml一樣。

在Hive官方文件中重點提到了Hive的日誌配置$HIVE_HOME/conf/hive-log4j.properties,雖然不是必要更改的配置檔案,但合理的設定會對我們有一定的幫助,具體配置方法可見官方文件。


使用

Hive提供了一個CLI(Command Line Interface)客戶端,我們可以通過CLI進行直觀的DDL、DML及SQL操作。以下是CLI使用示例:

1 # 這裡建立了一個foo表,欄位以\001分隔,location指定對映檔案位置
2 create external table foo
3 (
4 uid bigint,
5 brand_value string
6 )
7 row format delimited fields terminated by '\001'
8 stored as textfile
9 location "/group/tbsc-dev/haowen/temp/shpsrch_bshop_brand_value_ssmerge_1011/";
10
11 # 插入資料到 foo表 注意這些語句不要用tab縮排
12 INSERT OVERWRITE TABLE foo
13 select uid,value_data
14 from
15 (
16 select t1.uid,t2.value_data
17 from
18 shpsrch_bshop_brand_unfold_ssmerge_1011 t1
19 join sel_shpsrch__base_values t2
20 on t1.brand_id = t2.value_id and t2.ds=20101019
21 ) a;

也可以在終端介面這樣使用

1 echo "select * from foo where uid=153702175;" | hive -u root -p root


資料join

之前在資料join的時候遇到過這樣一個問題,就是當一個uid 對應多個品牌brand_id 的時候,即:
uid – brand_id1 = brand_id1 – brand_value1
uid – brand_id2 = :
uid – brand_id3 = :
這樣join之後的資料會出現:
uid – brand_value1
uid – brand_value1
這個樣子相同的多條記錄,出現數據重複的現象
如果資料量小的話,最簡單的除錯辦法是 這樣:把所有的資料放在一個namenode上面跑

1 hive -u root -p root  <<EOF
2
3 # 指定reduced的任務數量
4 set mapred.reduce.tasks=1;
5 add file /data/tiechou/ssmerge/mod/mod_bshop_brand/script/brand_packed.pl;
6 explain
7 INSERT OVERWRITE TABLE foo
8 select transform(uid, value_data)
9 using 'brand_packed.pl'
10 as uid,brand_value
11 from
12 (
13 select t1.uid,t2.value_data
14 from
15 shpsrch_bshop_brand_unfold_ssmerge_1011 t1
16 join sel_shpsrch__base_values t2
17 on t1.brand_id = t2.value_id and t2.ds=1 distribute by t1.uid
18 ) a;
19 set mapred.reduce.tasks=256;
20 EOF

上面顯然不是最好的辦法,不過已經說明問題了,是相同uid被分到多個namenode上join引起的,其實hive是支援clusterBy? | distributeBy? sortBy? 的, clusterBy是 distributeBy? sortBy?的綜合

1 hive -u root -p root  <<EOF
2
3 add file /data/tiechou/ssmerge/mod/mod_bshop_brand/script/brand_packed.pl;
4 INSERT OVERWRITE TABLE foo
5 select transform(t3.uid,t3.value_data)
6 using 'brand_packed.pl'
7 as uid,brand_value
8 from(
9 from shpsrch_bshop_brand_unfold_ssmerge_1011 t1 join sel_shpsrch__base_values t2 on (t1.brand_id = t2.value_id and t2.ds=20101019) select t1.uid,t2.value_data distribute by t1.uid) t3;

最後我們普及一下sql join,在網上找了一個很形象的說明:http://coolshell.cn/articles/3463.html

SQL的Join語法有很多inner的,有outer的,有left的,有時候,對於Select出來的結果集是什麼樣子有點不是很清楚。Coding Horror上有一篇文章(實在不清楚為什麼Coding Horror也被牆)通過 文氏圖 Venn diagrams 解釋了SQL的Join。


假設我們有兩張表。

Table A 是左邊的表。

Table B 是右邊的表。


其各有四條記錄,其中有兩條記錄是相同的,如下所示:


id name id name

– —- — —-
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja


下面讓我們來看看不同的Join會產生什麼樣的結果。

1 SELECT * FROM TableA
2 INNER JOIN TableB
3 ON TableA.name = TableB.name


Inner join

id name id name
– —- — —-
1 Pirate 2 Pirate
3 Ninja 4 Ninja
結果集: 是A和B的交集。


Full outer join

1 SELECT * FROM TableA
2 FULL OUTER JOIN TableB
3 ON TableA.name = TableB.name


id name id name
– —- — —-
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader


結果集: 產生A和B的並集。但是需要注意的是,對於沒有匹配的記錄,則會以null做為值。


Left outer join

1 SELECT * FROM TableA
2 LEFT OUTER JOIN TableB
3 ON TableA.name = TableB.name


id name id name
– —- — —-
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null


Left outer join 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。

1 SELECT * FROM TableA
2 LEFT OUTER JOIN TableB
3 ON TableA.name = TableB.name
4 WHERE TableB.id IS null


hive 中實現方式

1 select a_id from (
2 select a.id as a_id,b.del_id as b_id
3 from shop a left outer join del b
4 on a.id = b.del_id )c
5 where b_id is null;


id name id name
– —- — —-
2 Monkey null null
4 Spaghetti null null


結果集: 產生在A表中有而在B表中沒有的集合。

1 SELECT * FROM TableA
2 FULL OUTER JOIN TableB
3 ON TableA.name = TableB.name
4 WHERE TableA.id IS null
5 OR TableB.id IS null


id name id name
– —- — —-
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader


結果集: 產生A表和B表都沒有出現的資料集。

還需要註冊的是我們還有一個是“交差集” cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的資料進行一個N*M的組合,即笛卡爾積。表示式如下:

1 SELECT * FROM TableA
2 CROSS JOIN TableB

這個笛卡爾乘積會產生 4 x 4 = 16 條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用巢狀的select語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對於效能來說是非常危險的,尤其是表很大的時候。

相關推薦

Hive基本原理應用

Hive的基本原理與使用本文轉自:http://tiechou.info/?p=33 簡介 Hive是基於Hadoop構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料。Hive可以將結構化的資料儲存在資料倉庫中,通過

hive基本操作應用

nbsp ima doc 統計 info inf 文檔 http hadoop 通過hadoop上的hive完成WordCount 啟動hadoop Hdfs上創建文件夾 上傳文件至hdfs 啟動Hive 創建原始文檔表 導入文件內容到表docs並查看 用

Zookeeper基本原理應用場景

        Zookeeper是層次化的目錄結構,命名符合常規檔案系統規範。每個節點在zookeeper中叫做znode,並且其有一個唯一的路徑標識。節點Znode可以包含資料和子節點(EPHEMERAL型別的節點不能有子節點)。Znode中的資料可以有多個版本,比如某一個路徑下存有多個數據版本,那麼查詢

基礎演算法(二):Kmeans聚類演算法的基本原理應用

Kmeans聚類演算法的基本原理與應用       內容說明:主要介紹Kmeans聚類演算法的數學原理,並使用matlab程式設計實現Kmeans的簡單應用,不對之處還望指正。 一、Km

【網絡爬蟲入門02】HTTP客戶端庫Requests的基本原理基礎應用

多應用 多服務器 技術學 用戶 iis unicode licensed content sed 【網絡爬蟲入門02】HTTP客戶端庫Requests的基本原理與基礎應用 廣東職業技術學院 歐浩源 1、引言 實現網絡爬蟲的第一步就是要建立網絡連接並向服務器或網頁等

hive基本操作應用

AI text -a SM 創建文件夾 con 結果 基本 input 1.啟動hadoop 2.Hdfs上創建文件夾 創建的文件夾是datainput 3.上傳文件至hdfs 啟動Hive 4。創建原始文檔表 5.導入文件內容到表docs並

防盜鏈的基本原理實現

rec eal limit ole 站點 new exceptio stub text 1. 我的實現防盜鏈的做法,也是參考該位前輩的文章。基本原理就是就是一句話:通過判斷request請求頭的refer是否來源於本站。(當然請求頭是來自於客戶端的,是可偽造的,暫不在本文

【CC2530入門教程-05】CC2530的串行接口原理應用

max blog 模式 指數 open != tab bre 就會 第5課 CC2530的串行接口原理與應用 廣東職業技術學院 歐浩源 一、並行通信與串行通信 微控制器與外設之間的數據通信,根據連線結構和傳送方式的不同,可以分為兩種:並行通信和串行通信。

交換機的基本原理配置

mac地址 console 以太網幀 securecrt 楊書凡 交換機工作在數據鏈路層,負責網絡相鄰節點之間的數據通信,並進行流量控制,主要通過幀在對等層間數據傳輸。在物理線路上提供可靠的數據傳輸,對網絡層而言為一條無差錯的線路。 MAC地址 計算機聯網的必備硬件是網卡,每

路由器的基本原理配置命令(靜態路由和默認路由)

路由技術 路由表 route命令 路由環路 楊書凡 路由器工作在OSI參考模型的網絡層,它的重要作用是為數據包選擇最佳路徑,最終送達目的地。那麽路由器是怎樣選擇路徑的呢?如果主機A要和主機B通信,就需要一種方法判斷源主機和目標主機所經過的最佳路徑,從而進行數據轉發,這就是路由技術。

SqlServer索引的原理應用

文件 char date 存儲空間 字段 文件頭 其它 要求 混合 索引的概念 索引的用途:我們對數據查詢及處理速度已成為衡量應用系統成敗的標準,而采用索引來加快數據處理速度通常是最普遍采用的優化方法。 索引是什麽:數據庫中的索引類似於一本書的目錄,在一本書中使用目錄可以

分布式開源調度框架TBSchedule原理應用

中文 就會 ans exc 中心 崩潰 任務創建 集中 通過 主要內容: 第一部分 TBSchedule基本概念及原理 1. 概念介紹 2. 工作原理 3. 源代碼分析 4. 與其它開源調度框架對照 第二

DMZ原理應用

並且 安裝 位置 恰恰 重定向 ima 開放端口 互聯網 信息   DMZ是英文“demilitarized zone”的縮寫,中文名稱為“隔離區”,“非軍事化區”。它是為了解決安裝防火墻後外部網絡不能訪問內部網絡服務器的問題,而設立的一個非安全系統與安全系統之間的緩沖區,

數據庫原理應用 基於SQL Server 2005pdf

數據 數據模型 clear 設計 概念 第7章 漸進 col 理解 下載地址:網盤下載 《數據庫原理與應用 基於SQL Server 2005》介紹數據庫基本原理,並以sql server 2005為平臺介紹數據庫管理系統的應用。全書分為3部分,第l~5章介紹數據庫的一般

docker第一天:docker的基本原理安裝

原理 docker安裝 Docker官網:www.docker.com 一、docker是虛擬機嗎?不是,很多人在剛開始接觸docker的時候往往會進入一個誤區,其實docker≠VM 圖(一)在兩者的原理圖中不難看出,虛擬機運行多個應用時,如圖(一)所示:Serv

雲計算--網絡原理應用--20171115

斷開連接 廣播 自動 常用 開始 連接 ttl 意義 流動 IP 協議 ARP協議 TCP/UDP協議 網絡傳輸介質 一 IP協議 網絡層負責定義數據通過網絡流動所經過的路徑。主要功能如下: 定義基於IP協議的邏輯地址(IP地址) 選擇數據通過網絡的最佳路徑 連接不同

跨站請求偽造攻擊的基本原理防範

介紹 策略 範圍 二次 ued 養成 cookie 認證 request請求 摘要:文章介紹了跨站請求偽造攻擊的基本情況,並以兩種常見的場景作為講解的範例,分析了該類攻擊的主要原理與產生條件。針對跨站請求偽造攻擊的主要 目標和所利用的漏洞,重點介紹了5種不同的

Base64編碼原理應用

公鑰加密 利用 賬號 map 錯誤 tps 字符串 這一 協議 Base64編碼原理 Base64編碼之所以稱為Base64,是因為其使用64個字符來對任意數據進行編碼,同理有Base32、Base16編碼。標準Base64編碼使用的64個字符為: 這64個字符是各種字符

spring-AOP原理應用

圖片 spa 應用 framework round 子類 cee 過程 訪問 什麽是AOPSpring是解決實際開發中的一些問題:* AOP解決OOP中遇到的一些問題.是OOP的延續和擴展.AOP作用 對程序進行增強:不修改源碼的情況下. * AOP可以進行權限

Nginx基本配置應用

sed stat 3.3 star pes nlp lin 查看 mon 一、準備 1.1 環境準備 CentOS7軟件環境 1.2 tomcat多實例 把/etc/profile.d/tomcat.sh中的變量註釋了 #export TOMCAT_HOME=/usr/lo