A. hive 之 交、並、差 探析
上一篇說到了 join,本篇就簡單講一講對兩個表做交、並、差運算。
union 主要有兩種用法:
在 sql 語句中,有 intersect 關鍵字。那麼在hive 語句中,如何實現呢?
可以用 left outer join 或者更高效的left semi join 哦~
在 sql 語句中,有 minus 關鍵字,但是 hive 暫時還不支持,那麼問題來了,這回又要怎麼辦?
答案還是用 join 啦 ~
交集 和 差集 加在一起就是 上表的全部內容,那麼我們在 left outer join 之後的 where 語句中,把對下表的 key 值判斷由 is not null(即下表中該條數據存在,也就是交集) 換成 is null (下表中該條數據為 null ,也就是差集啦)即可~
B. HIVE OS系統對地址加密嗎
加密。Hiveos系統會對飛行表的加密線路設置,飛行表是軟體的整體配置,是使用這開源軟體的前提,必須的設置好,特別是要配置穩定不掉的地址。
C. mysql資料庫加密的,sqoop怎麼解密輸出在hive
mysql資料庫加密的,sqoop怎麼解密輸出在hive
直接導入hive表
sqoop import --connect jdbc:postgresql://ip/db_name--username user_name --table table_name --hive-import -m 5
內部執行實際分三部,1.將數據導入hdfs(可在hdfs上找到相應目錄),2.創建hive表名相同的表,3,將hdfs上數據傳入hive表中
sqoop根據postgresql表創建hive表
sqoop create-hive-table --connect jdbc:postgresql://ip/db_name --username user_name --table table_name --hive-table hive_table_name( --hive-partition-key partition_name若需要分區則加入分區名稱)
導入hive已經創建好的表中
sqoop import --connect jdbc:postgresql://ip/db_name --username user_name --table table_name --hive-import -m 5 --hive-table hive_table_name (--hive-partition-key partition_name --hive-partition-value partititon_value);
使用query導入hive表
sqoop import --connect jdbc:postgresql://ip/db_name --username user_name --query "select ,* from retail_tb_order where \$CONDITIONS" --hive-import -m 5 --hive-table hive_table_name (--hive-partition-key partition_name --hive-partition-value partititon_value);
注意:$CONDITIONS條件必須有,query子句若用雙引號,則$CONDITIONS需要使用\轉義,若使用單引號,則不需要轉義。
D. Hive解析Json數據
HIVE直接讀入json的函數有兩個:
(1)get_json_object(string json_string, string path)
返回值: string
說明:解析json的字元串json_string,返回path指定的內容。如果輸入的json字元串無效,那麼返回NULL。
舉例:
hive> select get_json_object(『{「store」:{「fruit」:[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], 「bicycle」:{「price」:19.95,」color」:」red」}}, 「email」:」amy@only_for_json_udf_ test.net 」, 「owner」:」amy」 } 『,』$.owner』) from al;
結果:amy
這個函數每次只能返回一個數據項。
(2)json_tuple(jsonStr, k1, k2, ...)
參數為一組鍵k1,k2……和JSON字元串,返回值的元組。該方法比 get_json_object 高效,因為可以在一次調用中輸入多個鍵
select a.timestamp, b.*
from log a lateral view json_tuple(a.appevent, 'eventid', 'eventname') b as f1, f2;
處理數據樣例:
{"GPS_LAT":39.8965125,"GPS_LONG":116.3493225,"GPS_SPEED":20.9993625,"GPS_STATE":"A","GPS_TIME":"2014-01-02 00:00:16","IMEI":"508597","after_oxygen_sensor":132,"air_condion_state":3,"bdoneNo_after_mileage":0,"bdoneNo_zero_mileage":8044,"db_speed":22,"direction_angle":358.2585,"front_oxygen_sensor":64,"instant_fuel":233,"speed":1210,"torque":33,"total_fuel":0}
處理HIVE語句:
create table 2014jrtest as select json_tuple(line,'GPS_LAT','GPS_LONG','GPS_SPEED','GPS_STATE','GPS_TIME','IMEI','after_oxygen_sensor','air_condion_state','bdoneNo_after_mileage','bdoneNo_zero_mileage','db_speed','direction_angle','front_oxygen_sensor','instant_fuel','speed','torque','total_fuel') from 2014test;
E. hadoop hue配置文件怎樣設置加密密碼
ue是一個開源的Apache Hadoop UI系統,最早是由Cloudera Desktop演化而來,由Cloudera貢獻給開源社區,它是基於Python Web框架Django實現的。通過使用Hue我們可以在瀏覽器端的Web控制台上與Hadoop集群進行交互來分析處理數據,例如操作HDFS上的數據,運行MapRece Job等等。很早以前就聽說過Hue的便利與強大,一直沒能親自嘗試使用,下面先通過官網給出的特性,通過翻譯原文簡單了解一下Hue所支持的功能特性集合:
默認基於輕量級sqlite資料庫管理會話數據,用戶認證和授權,可以自定義為MySQL、Postgresql,以及Oracle
基於文件瀏覽器(File Browser)訪問HDFS
基於Hive編輯器來開發和運行Hive查詢
支持基於Solr進行搜索的應用,並提供可視化的數據視圖,以及儀錶板(Dashboard)
支持基於Impala的應用進行互動式查詢
支持Spark編輯器和儀錶板(Dashboard)
支持Pig編輯器,並能夠提交腳本任務
支持Oozie編輯器,可以通過儀錶板提交和監控Workflow、Coordinator和Bundle
支持HBase瀏覽器,能夠可視化數據、查詢數據、修改HBase表
支持Metastore瀏覽器,可以訪問Hive的元數據,以及HCatalog
支持Job瀏覽器,能夠訪問MapRece Job(MR1/MR2-YARN)
支持Job設計器,能夠創建MapRece/Streaming/Java Job
支持Sqoop 2編輯器和儀錶板(Dashboard)
支持ZooKeeper瀏覽器和編輯器
支持MySql、PostGresql、Sqlite和Oracle資料庫查詢編輯器
1 Hue安裝(參考官網:http://gethue.com/how-to-build-hue-on-ubuntu-14-04-trusty/)
1.1 在git上下載HUE源碼或者在它的官網下載(如果已經安裝git可省略第一步)
sudo apt-get install git
git clone https://github.com/cloudera/hue.git
1.2 需要安裝一些依賴的軟體包
官網給出了一些,如果環境不一樣,靈活調整,GIT上面給出的依賴文件列表:
F. Hive 動態分區
Hive的insert語句能夠從查詢語句中獲取數據,並同時將數據Load到目標表中。現在假定有一個已有數據的表staged_employees(雇員信息全量表),所屬國家cnty和所屬州st是該表的兩個屬性,我們做個試驗將該表中的數據查詢出來插入到另一個表employees中。
由於使用了OVERWRITE關鍵字,目標表中原來相同partition中的所有數據被覆蓋,如果目標表中沒有partition,則整個表會被覆蓋。
如果把OVERWRITE關鍵字刪掉,或者替換成INTO,則hive會追加而不是替代原分區或原表中的數據,這個特性在Hive v0.8.0之後才支持。
當數據已經存在於hdfs上但不是我們想要的格式的時候,當進行的計算需要分好多步驟有必要存儲中間數據的時候,或者原數據沒有分區、有很多無效列需要過濾的時候,可以使用insert..select句型來完成這一轉換過程。
由於一個國家有很多個省份,如果想根據(國家country,地區partition)兩個維度對數據進行分區的話,這條SQL語句的執行個數應該等於地區的數目,比如中國有23個省就要對該SQL語句執行23次。因此hive對這個SQL語句進行了改造,只需要掃描一次原表就可以生成不同的輸出(多路輸出)。比如下面的SQL語句掃描了一次原始數據表,但是同時生成了3個省份的結果數據:
通過縮進可以很清楚的看到,我們掃描了一次staged_employees表但是執行了3次不同的insert語句,這條大SQL語句是這么執行的:先通過from staged_employees表獲取一條記錄,然後執行每一個select子句,如果select子句驗證通過則執行相應的insert語句。注意這里的三條select子句是完全獨立執行的,並不是if .. then .. else的關系,這就意味著這3條select子句在某種情況下可能同時通過where檢測。
通過這種結構,原始表的數據能被拆分到目標表的不同partition中去。
如果原表的一條記錄滿足於其中一個給定的select .. where .. 子句,則該記錄將被寫到目標表的固定分區中。其實更進一步,每條Insert語句能將數據寫到不同的數據表中,不管這個表是否分區都一樣。
於是,就像一個過濾器一樣,原表的一些數據被寫到了很多輸出地址,而剩下的數據會被丟棄。
當然,你也可以混用Insert overwrite和insert into兩種不同的方法寫出數據。
向動態分區插入數據
但是問題還是沒有解決,中國有23個省,那麼我們就需要寫23個insert into .. select ..where子句,這非常不現實。於是hive的一種叫做動態分區的特性就出現了,它能夠根據select出來的參數自動推斷將數據插入到那個分區中去。本文上面的兩種SQL語句設定分區的方式都叫做靜態分區插入。
將上一個SQL語句進行改動,會得到以下簡潔的新SQL語句:
hive先獲取select的最後兩個位置的se.cnty和se.st參數值,然後將這兩個值填寫到Insert語句partition中的兩個country和state變數中,即動態分區是通過位置來對應分區值的。原始表select出來的值和輸出partition的值的關系僅僅是通過位置來確定的,和名字並沒有關系,比如這里se.cnty和county的名稱完全沒有關系。
上面的這條SQL語句是對兩個分區同時進行了動態設定,如果staged_employees表中有100個國家,每個國家有100個地區,那麼該SQL語句自動對每個國家和地區建立相應的partition並插入數據,如果用手寫的話不現實。
只要位置正確,你可以混用動態分區和靜態分區值設定,比如下面這個例子,你可以靜態指定一個country值,但是state值採用動態的方法設定:
注意:靜態分區值必須在動態分區值的前面!
使用hive動態分區的參數設定
動態分區功能默認是關閉的,而當它是打開狀態時,默認會工作在「strict」模式下,這種模式下要求至少指定一個靜態分區的值。這樣做是為了防止設計了大量partition的糟糕情況,舉個例子你使用時間戳來進行分區,竟然每一秒鍾都產生一個分區!還有其他的一些屬性設定用來限制類似的情況出現,如下表所示:
名稱 默認值 描述
hive.exec.dynamic.partition false 設置為true用於打開動態分區功能
hive.exec.dynamic.partition.mode strict 設置為nonstrict能夠讓所有的分區都動態被設定,否則的話至少需要指定一個分區值
hive.exec.max.dynamic.partitions.pernode 100 能被每個mapper或者recer創建的最大動態分區的數目,如果一個mappre或者recer試圖創建多餘這個值的動態分區數目,會引發錯誤
hive.exec.max.dynamic.partitions +1000 被一條帶有動態分區的SQL語句所能創建的動態分區總量,如果超出限制會報出錯誤
hive.exec.max.created.files 100000 全局能被創建文件數目的最大值,專門有一個hadoop計數器來跟蹤該值,如果超出會報錯
舉個例子,使用全動態分區的SQL語句序列如下所示,需要先設定一些必要的參數才可以:
總結
使用from .. insert.. select ..where結構能夠從一個數據表中抽取數據,將結果插入到不同的表和分區中,而使用動態分區能夠讓hive根據select最末幾個位置的值自動設定目標分區的值,使用動態分區需要設定一些hive運行參數。
轉自 http://www.crazyant.net/1197.html
G. hive建表語句
因為用mr對hdfs進行操作比較繁瑣,所以才出現了hive。 hive本質上進行操作的還是hdfs文件,而不是表。 所以在一些地方,為了迎合hdfs文件,與sql語言有些許的不同。比如在建表方面的不同,在一些函數上的不同等。
參考: Hive學習3:Hive三種建表語句詳解
在建表時,要通過語法,將HDFS上的文件映射成表結構。所以在建表時與sql上有些許不同。
不過,建立好表以後,已經映射成表結構,那麼操作就跟sql很相似了。
其中,映射過程中會有參數row format(行的格式) 和 file format(文件的格式) 兩個參數。
row format 表示的是行在存儲時的序列化 與 反序列化 的規則。一般後面都是定好了默認參數的。需要的時候再改。
比如,給表定好了,列按照逗號分割,某個欄位按照「-」分割,map型欄位按照「:」分割。
這樣訂好了形式以後,就能夠讓系統比較合理的進行序列化與反序列化了
表示hdfs文件存放的格式,默認是TEXTFILE,文本格式,可以直接打開。
按照參考的網頁,建表。注意,建表的時候,已經指明了各個欄位的類型,所以在進行分割的時候就很容易了。
參考: Hive的數據存儲
元數據,是用來描述數據的數據。 表中的數據,比如,25,31是數據。而元數據中,元數據「年齡」就是用來描述25,31的。所以說,元數據是這種用來描述數據的數據。
在hive中
區別:
建立外部表(這里t2 被external所修飾了)
'''
create external table t2(
id int
,name string
,hobby array<string>
,add map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/t2'
;
'''
將子查詢的結果存在新表裡,表中有數據 。通過as查詢語句完成建表。
例子:
創建結構完全相同的表,但是沒有數據。
例子:
create table t4 like t2;
H. hive insert into語句 和 insert overwrite語句
剛開始學hive,查 hive insert into語句 和 insert overwrite語句 區別的時候網路出來第一條寫錯了,差點被坑。。。。。
1.insert into是增加數據
2.insert overwrite是刪除原有數據然後在新增數據,如果有分區那麼只會刪除指定分區數據,其他分區數據不受影響
寫insert語句的時候都是要將整個表的值overwrite。因為它的存儲層是HDFS,插入一個數據要全表掃描,還不如用整個表的替換來的快些。
I. 數據倉庫Hive
一個公司裡面不同項目可能用到不同的數據源,有的存在MySQL裡面,又的存在MongoDB裡面,甚至還有些要做第三方數據。
但是現在又想把數據整合起來,進行 數據分析 。此時數據倉庫(Data Warehouse,DW)就派上用場了。它可以對多種業務數據進行篩選和整合,可以用於數據分析、數據挖掘、數據報表。
總的來說,數據倉庫是將多個數據源的數據按照一定的 主題 集成起來,因為之前的數據各不相同,所以需要 抽取、清洗、轉換 。
整合以後的數據不允許隨便修改,只能分析,還需要定期更新。
上面我們說過,數據倉庫接收的數據源是不同的,要做集成的話,需要 抽取、清洗、轉換 三個步驟,這就是 ETL (Extract-Transform-Load)
國內最常用的是一款基於Hadoop的開源數據倉庫,名為 Hive ,它可以對存儲在 HDFS 的文件數據進行 查詢、分析 。
Hive對外可以提供HiveQL,這是類似於SQL語言的一種查詢語言。在查詢時可以將HiveQL語句轉換為 MapRece 任務,在Hadoop層進行執行。
Hive的最大優勢在於 免費 ,那其他知名的商業數據倉庫有那些呢?比如Oracle,DB2,其中業界老大是 Teradata
Teradata數據倉庫支持大規模並行處理平台(MPP),可以高速處理海量實際上,性能遠遠高於Hive。對企業來說,只需要專注於業務,節省管理技術方面的精力,實現ROI(投資回報率)最大化。
上面提到了Hive是最著名的開源數據倉庫,它是Hadoop生態中一個重要的組件。
Hadoop的生態中,HDFS解決了分布式存儲的問題,MapRece解決了分布式計算的問題,而HBASE則提供了一種NoSQL的存儲方法。
但是如果需要的HDFS上的文件或者HBASE的表進行查詢,需要自定義MapRece方法。那麼Hive其實就是在HDFS上面的一個中間層,它可以讓業務人員直接使用SQL進行查詢。
所以Hive是用進行數據提取轉換載入的,而且它可以把SQL轉換為MapRece任務,而Hive的表就是HDFS的目錄或者文件。
上圖為Hive的體系結構
Hive主要包含以下幾種數據模型:
本文為 什麼是數據倉庫? 的筆記