Hive和SQL編碼新手指南
Apache Hive通常被稱為建立在Apache Hadoop之上的數據倉庫基礎架構。 最初由Facebook開發,每天查詢大約20TB的數據,目前,程序員可使用它對存儲在文件系統(例如HDFS(Hadoop分佈式框架系統))中的大型數據集進行臨時查詢和分析,而無需瞭解地圖的詳細信息 -減少。 Hive最好的部分是Hive引擎將查詢隱式轉換為有效的鏈映射減少任務。
Hive的功能:
· 支持不同的存儲類型,例如純文本,csv,Apache Hbase等
· 數據建模,例如創建數據庫,表等
· 易於編碼; 使用稱為HiveQL的類似SQL的查詢語言
· ETL功能,例如將數據提取,轉換和將數據加載到與聯接,分區等結合在一起的表中。
· 包含內置的用戶定義函數(UDF)以操縱日期,字符串和其他數據挖掘工具
· 無論佈局如何,非結構化數據均以數據形式顯示為表格
· 自定義映射器,Reducer和UDF的插件功能
· Hadoop上的增強查詢
Hive的用例:
· 文本挖掘-使用map-reduce覆蓋和分析具有方便結構的非結構化數據
· 文檔索引編制—將標籤分配給多個文檔,以便於恢復
· 業務查詢-查詢大量歷史數據以獲得可行的見解,例如 交易記錄,付款記錄,客戶數據庫等
· 日誌處理-處理各種類型的日誌文件,例如呼叫日誌,Web日誌,機器日誌等。
Hive中的編碼
我們將使用一個稱為"事務"的表來查看如何在Hive中查詢數據。 交易表包含屬性ID,項目和銷售。
這是任何編程語言的一些最佳編碼實踐。
Hive中的DDL命令
DDL是數據定義語言(Data Definition Language)的簡稱,它處理數據庫模式和描述,以及如何將數據保留在數據庫中。 一些常見的例子是
建立表格
· 創建表-CREATE TABLE transaction(id INT, item STRING, sales FLOAT);
· 對錶進行分區- CREATE TABLE transaction(id INT, item STRING, sales FLOAT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\\001’ STORED AS TEXTFILE LOCATION <hdfs>;/<hdfs>
刪除表格
· DROP TABLE transaction;
修改表
· ALTER TABLE transaction RENAME TO transaction_front_of_stores;
· 添加列— ALTER TABLE transaction ADD COLUMNS (customer_name STRING);
顯示錶
· SHOW TABLES;
描述表
· DESCRIBE transaction;
· DESCRIBE EXTENDED transaction;
HIVE中的DML命令
DML是處理數據操作的數據操作語言的簡稱,包括最常用的SQL語句,例如SELECT,INSERT,UPDATE,DELETE等。它主要用於存儲,修改,檢索,刪除和更新數據。 數據庫。
加載數據中
· 從外部文件加載數據— LOAD DATA LOCAL INPATH “<file>” [OVERWRITE] INTO TABLE <table>;
· LOAD DATA LOCAL INPATH “/documents/datasets/transcation.csv” [OVERWRITE] INTO TABLE transaction;
· 從單獨的表寫入數據集-INSERT OVERWRITE TABLE transaction SELECT id, item, date, volume FROM transaction_updated;
select語句用於從數據庫表中獲取數據。 主要用於查看記錄,選擇所需的字段元素,獲取不同的值以及顯示來自任何過濾器,限制或按操作分組的結果。
要從事務表中獲取所有記錄:
SELECT * FROM Transaction;
要從交易表中獲取不同的交易ID:
SELECT DISTINCT ID FROM Transaction;
與Select語句一起使用以限制編碼器要查看的行數。 任何交易數據庫都包含大量數據,這意味著選擇每一行都將導致更長的處理時間。
SELECT * FROM transaction LIMIT 10;
過濾條件
SELECT * FROM transaction WHERE sales>100;
分組依據語句用於彙總不同級別的數據。 想一想我們要按項目計算總銷售額的情況。
SELECT item, SUM(sales) as sale FROM transaction GROUP BY item;
如果我們想過濾掉所有銷售額至少達到1000的商品怎麼辦?
SELECT item, SUM(sales) as sale FROM transaction GROUP BY item HAVING sale>1000;
Jion Hive
為了合併和檢索來自多個表的記錄,我們使用了Hive Join。 當前,Hive支持兩個或更多表的內部,外部,左和右聯接。 語法類似於我們在SQL中使用的語法。 在研究語法之前,讓我們瞭解不同的聯接如何工作。
SELECT A.* FROM transaction A {LEFT|RIGHT|FULL} JOIN transaction_date B ON (A.ID=B.ID);
筆記:
· Hive不支持IN / EXISTS子查詢
· Hive不支持不包含相等條件的聯接條件
· 可以聯接多個表,但可以組織表,以使最大的表出現在序列的最後
在Hive中優化查詢
要優化配置單元中的查詢,這是您應該知道的5條經驗法則
· 分組依據,聚合功能和聯接默認情況下在化簡器中進行,而過濾器操作在映射器中進行
· 使用hive.map.aggr = true選項直接在地圖任務中執行第一級聚合
· 根據執行的任務類型設置映射器/還原器的數量。 對於過濾條件,請使用set mapred.mapper.tasks = X;。 對於聚合操作:設置mapred.reduce.tasks = Y;
· 在聯接中,序列中的最後一個表通過簡化器流式傳輸,而其他表則被緩衝。 整理表格,使最大的表格出現在序列的最後
· 可以使用STREAM TABLE和MAP JOINS加快連接任務的速度
本文重點介紹Hive,它的功能,用例和Hive查詢。 由於許多DML和DDL查詢與SQL非常相似,因此它可以充當SQL新手的基礎或構建塊。
(本文翻譯自Angel Das的文章《Introduction to Hive》,參考:https://towardsdatascience.com/introduction-to-hive-859ba31a5769)
"/<table>/<file>閱讀更多 聞數起舞 的文章