Hive最新資料操作詳解(超級詳細)
資料:employee_hr.txt http://pan.baidu.com/s/1c0D9TpI
例:
hive>(不用輸入,在此表示在Hive的shell輸入以下命令,下同) CREATE TABLE IF NOT EXISTS employee_hr( name string, employee_id int, sin_number string, start_date timestamp ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE;
例:
注1:在指令中LOCAL關鍵字用於指定資料從本地載入,如果去掉該關鍵字,預設從HDFS進行載入! OVERWRITE關鍵字指定使用覆蓋方式進行載入資料,否則使用附加方式進行載入。
注2:如果資料載入到分割槽表,則必須指定分割槽列。
2. INSERT 同RDBMS一樣,Hive也支援從其他hive表提取資料插入到指定表,使用INSERT關鍵字。INSERT操作是Hive資料處理中最常用的將已有資料填充進指定表操作。在Hive中,INSERT可以和OVERWRITE一起使用實現覆蓋插入,可以進行多表插入,動態分割槽插入以及提取資料至HDFS或本地。
例:
例:
hive> INSERT INTO TABLE employee SELECT * FROM ctas_employee; 注:這裡使用Hive提供的beeline工具進行連線,以便清晰的顯示資料表。
例:從CTE插入資料 hive> WITH a AS (SELECT * FROM ctas_employee) FROM a INSERT OVERWRITE TABLE employee SELECT *; //效果和上例相同 注:Hive從0.13.0版本開始支援CTE
例:多表插入
Hive除了支援向靜態分割槽插入靜態資料,還支援插入動態資料,如日期
例:動態分割槽插入 動態分割槽預設是關閉的,可通過以下設定開啟:SET hive.exec.dynamic.partition=true; Hive預設至少需要一個partition列是靜態的,可以通過以下設定關閉:SET hive.exec.dynamic.partition.mode=nonstrict; hive> INSERT INTO TABLE employee_partitioned PARTITION(year,month) SELECT name,array('Toronto') AS work_place, named_struct("sex","Male","age",30) AS sex_age, map("Python",90) AS skills_score, map("R&D",array('Developer')) AS depart_title, year(start_date) AS year, month(start_date) AS month FROM employee_hr eh WHERE eh.employee_id = 102;
例:
hive> SELECT * FROM employee_partitioned;
例:提取資料至本地(預設使用^A分離列,換行符分離行) 注:Hive提取資料只能使用OVERWRITE, 不能使用INTO。 注:在一些Hadoop版本中目錄深度只支援到2層,可以使用以下設定修復:SET hive.insert.into.multilevel.dirs=true; hive> INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca' SELECT * FROM employee; 注:預設下Hive會將資料按reducer數量生成多個輸出檔案,可以使用以下命令進行合併: hdfs dfs -getmerge hdfs://:port/user/output/directory
例:使用特定分隔符分隔行 hive> INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca/yanh/data' ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' SELECT * FROM employee;
例:Hive同樣能多目錄輸出檔案 hive> FROM employee INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca/yanh/data1' SELECT * INSERT OVERWRITE LOCAL DIRECTORY '/apps/ca/yanh/data2' SELECT * ;
3. EXPORT and IMPORT 這兩條命令是Hive用來和HDFS進行資料遷移或者進行資料備份的,從Hive0.8.0開始可用。EXPORT可以匯出資料以及元資料到HDFS,元資料被命名為_metadata. 資料被放在命名為data的目錄下
例: hive>
EXPORT TABLE employee TO '/apps/ca/yanh/data';
注:輸出目錄不能已存在
例:將輸出的資料匯入Hive(將資料匯入到已有的表將報錯) hive>
IMPORT FROM '/apps/ca/yanh/data';
例:匯入到新表(也可以是EXTERNAL表) hive>
IMPORT TABLE employee_imported FROM '/apps/ca/yanh/data';
例:partition表匯入匯出 hive>
EXPORT TABLE employee_partitioned PARTITION (year=2015,month=05) TO '/apps/ca/yanh/data1';
例:
hive>
IMPORT TABLE employee_partitioned_imported FROM '/apps/ca/yanh/data1';
二、 資料排序 資料排序主要包括:ORDER, and SORT. 該操作同樣經常使用,以便生成已排序表從而進行後面的包括top N, maximum, minimum等取值操作。 主要操作包括ORDER BY (ASC|DESC)、SORT BY(ASC|DESC)、DISTRIBUTE BY、CLUSTER BY
1. ORDER BY (ASC|DESC) 跟RDBMS的ORDER BY操作類似,該操作輸出一個全域性排序的結果,因此reducer的輸出結果僅有一個,所以如果大資料量下過程是十分漫長的!這時可以時候LIMIT關鍵字提高輸出效率。如果Hive設定hive.mapred.mode = strict,那LIMIT關鍵字將不可使用(預設是可以使用的)。
例:按名字從大到小排序(如果資料量大,可以在最後加上LIMIT n來顯示前n行) hive>
SELECT name FROM employee ORDER BY name DESC;
2. SORT BY(ASC|DESC) 與ORDER BY (ASC|DESC)操作不同,SORT BY(ASC|DESC)操作僅輸出區域性有序的結果(即多個reducer輸出,每個輸出有序)。如果要輸出全域性有序,可以通過SET mapred.reduce.tasks=1;來制定reducer個數為1. 此時效果與ORDER BY (ASC|DESC) 相同。SORT BY指定列排序,可以在資料從mapper端全部傳入之前完成排序(只要該列傳輸完畢)。
例: hive>
SET mapred.reduce.tasks=2; SELECT name FROM employee SORT BY name DESC; 設定2個reducer,可以看到結果並不是從大到小排列的。
例: hive>
SET mapred.reduce.tasks=1; SELECT name FROM employee SORT BY name DESC; 設定1個reducer,此時與ORDER BY結果相同!
3. DISTRIBUTE BY 該操作類似於RDBMS中的GROUP BY,根據制定的列將mapper的輸出分組傳送至reducer,而不是根據partition來分組資料。 注:如果使用了SORT BY,那麼必須在DISTRIBUTE BY之後,且要分發的列必須出現在已選擇的列中(因為SORT BY的性質)。
例:為選擇employee_id,出錯 hive>
SELECT name FROM employee_hr DISTRIBUTE BY employee_id;
例: hive> SELECT name,employee_id FROM employee_hr DISTRIBUTE BY employee_id SORT BY name;
4. CLUSTER BY CLUSTER BY類似於DISTRIBUTE BY和SORT BY的組合作用(作用於相同列),但不同於ORDER BY的是它僅在每個reducer進行排序,而不是全域性排序,且不支援ASC和DESC。如果要實現全域性排序,可以先進行CLUSTER BY然後再ORDER BY。
例: hive> SELECT name, employee_id FROM employee_hr CLUSTER BY name;
ORDER BY和CLUSTER BY不同之處如下圖所示:
三、 資料操作和方法 為了更進一步的資料操作,我們可以對Hive進行諸如表示式、操作、方法等來對資料進行轉換。在Hive wiki https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF上已經對每一個表示式和方法進行了規範。同時Hive也已經定義了一些關係型的操作、算術運算操作、邏輯運算操作、複雜型別構造器以及複雜型別操作。對於其中的關係型的操作、算術運算操作、邏輯運算操作而言,和SQL/Java中的標準操作比較類似。 Hive中的方法大致可以分為以下幾類:數學函式:這些方法主要用於數學計算,如RAND()何E().
彙總函式:這些方法主要用於對複雜型別進行size、key、value等的查詢,如SIZE(Array).
型別轉換函式:這些方法主要用於對資料型別進行轉換,如CAST和BINARY.
日期函式:用於對日期相關進行操作,如YEAR(string date)和MONTH(string date).
條件函式:用於返回特定條件過濾後的函式,如COALESCE、IF、和CASE WHEN.
字串函式:此類函式主要用於字串相關操作,如UPPER(string A) 和TRIM(string A).
聚合函式:此類函式主要用於資料聚合,如SUM(),COUNT(*).
列表生成函式:此類函式主要用於將單行輸入轉換為多行輸出,如EXPLODE(MAP)和JSON_TUPLE(jsonString, k1, k2, ...).
自定義函式:此類由Java生成的函式作為Hive的擴充套件函式對Hive功能進行擴充套件.
可以在Hive CLI使用以下語句進行Hive內建函式查詢: SHOW FUNCTIONS; //列出Hive所有函式 DESCRIBE FUNCTION ; //函式詳細描述 DESCRIBE FUNCTION EXTENDED ; //更多詳細資訊
詳細樣例:
1. 複雜資料型別函式提示:SIZE函式用於計算MAP、ARRAY或巢狀MAP/ARRAY。如果size未知則返回-1.
例: hive> SELECT work_place, skills_socre, depart_title FROM employee;
例: hive> SELECT SIZE(work_place) AS array_size, SIZE(skills_score) AS map_size, SIZE(depart_title) AS complex_size, SIZE(depart_title["Product"]) AS nest_size FROM employee;
ARRAY_CONTAINS宣告用於使用TRUE或FALSE返回值檢驗指定列是否包含指定值。SORT_ARRAY宣告用於對陣列進行升序排序。
例: hive> SELECT ARRAY_CONTAINS(work_place, 'Toronto') AS is_Toronto, SORT_ARRAY(work_place) AS sorted_array FROM employee;
2. 日期函式提示:FROM_UNIXTIME(UNIX_TIMESTAMP())宣告與Oracle中的SYSDATE函式相同,動態返回Hive伺服器的當前時間。
例: hive> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()) AS current_time FROM employee limit 1;
TO_DATE用於將獲取的系統時間擷取日期
例: hive> SELECT TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP())) AS current_date FROM employee limit 1;
3. 多種不同資料型別的CASE:在Hive0.13.0版本之前THEN或者ELSE後面的資料型別必須相同。否則可能會產生異常值,如ELSE後的資料型別必須同THEN。此問題在0.13.0之後得到修復。
例:由於資料型別不同造成異常返回 hive> SELECT CASE WHEN 1 IS NULL THEN 'TRUE' ELSE 0 END AS case_result FROM employee LIMIT 1;
4. 解析和查詢:LATERAL VIEW是用來生成使用者自定義表以展開的形式顯示map或array的值,如同EXPLODE(),但其會忽略值為NULL的列,如果要顯示這些列,可以使用LATERAL VIEW OUTER(Hive0.12.0之後版本)
例: hive> INSERT INTO TABLE employee SELECT 'Steven' AS name, array(null) AS work_place, named_struct("sex","Male","age",30) AS sex_age, map("Python", 90) AS skills_score, map("R&D",array('Developer')) AS depart_title FROM employee LIMIT 1; SELECT name, work_place, skills_score FROM employee;
例: hive> SELECT name, workplace, skills, score FROM employee LATERAL VIEW explode(work_place) wp AS workplace LATERAL VIEW explode(skills_score) ss AS skills, score;
例: hive> SELECT name, workplace, skills, score FROM employee LATERAL VIEW OUTER explode(work_place) wp AS workplace LATERAL VIEW explode(skills_score) ss AS skills, score;
REVERSE用於將指定字串進行反轉,SPLIT用於將字串按指定分隔符進行分隔。
例: hive> SELECT reverse(split(reverse('/apps/ca/yanh/employee.txt'),'/')[0]) AS linux_file_name FROM employee LIMIT 1;
REVERSE將輸出轉換為單獨元素,而COLLECT_SET和COLLECT_LIST則是反過來將元素組合成集合進行輸出。COLLECT_SET和COLLECT_LIST的不同在COLLECT_SET返回的集合不含重複元素,而COLLECT_LIST則可以包含重複元素。
例: hive> SELECT collect_set(work_place[0]) AS flat_wprkplace FROM employee;
例:
hive> SELECT collect_list(work_place[0]) AS flat_wprkplace FROM employee; 注:Hive0.11.0及以前不支援collect_list
5. 虛擬列:虛擬列是Hive中特殊的列的特殊函式型別。目前為止Hive僅支援2個虛擬列:INPUT_FILE_NAME和BLOCK_OFFSET_INSIDE_FILE。INPUT_FILE_NAME列是mapper的輸入檔名,BLOCK_OFFSET_INSIDE_FILE是當前全部檔案位置或當前壓縮檔案的塊偏移量。
例: hive> SELECT INPUT_FILE_NAME, BLOCK_OFFSET_INSIDE_FILE AS OFFSIDE FROM employee_id; 注:在Hive0.13.0上測試失敗,沒有該函式。
6. wiki未提到的函式:
例:isnull,用於檢驗值是否為空 hive> SELECT work_place, isnull(work_place) is_null, isnotnull(work_place) is_not_null FROM employee;
例:assert_true,如果條件為false時丟擲異常 hive> SELECT assert_true(work_place IS NULL) FROM employee;
例:elt,返回第n個字串 hive> SELECT elt(2, 'New York', 'Beijing', 'Toronto') FROM employee LIMIT 1;
例:current_database,返回當前資料庫名 hive> SELECT current_database(); 注:Hive0.11.0及以前沒有此函式
四、 資料轉換 在Hive0.13.0以前不支援行級的資料轉換。因此,資料行的更新、插入、刪除都不能實現。因此資料重寫只能發生在表或者分割槽,這使得Hive很難處理併發讀寫和資料清洗的情況。但是從0.13.0開始,Hive提供了原子性、一致性、隔離性和永續性(ACID)的行級資料處理功能。如今所有的轉換操作支援ORC(優化排柱狀,從Hive0.11.0開始支援)檔案和桶列表中的資料。
以下配置引數需要適當的配置以開啟Hive的轉換功能: SET hive.support.concurrency = true; SET hive.enforce.bucketing = true; SET hive.exec.dynamic.partition.mode = nonstrict; SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; SET hive.compactor.initiator.on = true; SET hive.compactor.worker.threads = 1;
SHOW TRANSACTIONS可以對當前已開啟的轉換操作進行查詢: hive> SHOW TRANSACTIONS;
從Hive0.14.0開始,行級插入數值、更新和刪除可以使用以下語法規則進行實現: INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row …]; UPDATE tablename SET column = value [, column = value…] [WHERE expression]; DELETE FROM tablename [WHERE expression];
結語 以上便是全部Hive的關於資料的具體操作,相信到此為止應該能對Hive的常規資料操作進行較為得心應手的使用了吧。以上有截圖的用例均由本人親測可行,測試環境為Hive0.11.0,部分Hive0.13.0的特性是在0.13.0下進行測試,在截圖下均有說明。
QQ技術交流群:513848061
相關推薦
Hive最新資料操作詳解(超級詳細)
資料操作能力是大資料分析至關重要的能力。資料操作主要包括:更改(exchange),移動(moving),排序(sorting),轉換(transforming)。Hive提供了諸多查詢語句,關鍵字,操作和方法來進行資料操作。一、 資料更改 資料更改主要包括:LOAD, I
Quartz中的cronExpression 表示式的格式詳解(超級詳細)
(看完之後就可以直接線上生成表示式了。。。。)cron 表示式的格式Quartz cron 表示式的格式十分類似於 UNIX cron 格式,但還是有少許明顯的區別。區別之一就是 Quartz 的格式向下支援到秒級別的計劃,而UNIX cron 計劃僅支援至分鐘級。許多我們的
Git遠程操作詳解(新手必備)
tar etc rename 也有 mas 本地文件 轉載 其中 efault Git是目前最流行的版本管理系統,學會Git幾乎成了開發者的必備技能。 Git有很多優勢,其中之一就是遠程操作非常簡便。本文詳細介紹5個Git命令,它們的概念和用法,理解了這些內容,你就會完全掌
Java資料結構詳解(十二)- HashMap
HashMap 基於雜湊表的 Map 介面的實現。此實現提供所有可選的對映操作,並允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證對映的順序,特別是它不保證該順序恆
windows系統平臺下的PE檔案格式和資料定義詳解(附帶詳細高清大圖)
PE(Portable Executable)格式,是微軟Win32環境可移植可執行檔案(如exe、dll、vxd、sys和vdm等)的標準檔案格式。 PE格式衍生於早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)檔案格式
Tomcat目錄結構詳解(非常詳細)
Tomcat7 的目錄結構如圖: · 1、bin:該目錄下存放的是二進位制可執行檔案,如果是安裝版,那麼這個目錄下會有兩個exe檔案:tomcat6.exe、tomcat6w.exe,前者是在控制檯下啟動Tomcat,後者是彈出UGI視窗啟動Tomcat;如果是解壓版,那
c語言連結串列詳解(超詳細)
連結串列是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。連結串列可以動態的進行儲存分配,也就是說,連結串列是一個功能極為強大的陣列,他可以在節點中定義多種資料型別,還可以根據需要隨意增添,刪除,插入節點。連結串列都有一個頭指標,一般以head來表示,存放的是一個地
tf.slice()函式詳解(極詳細)
[TOC] tf.slice()是TensorFlow庫中分割張量的一個函式,其定義為def slice(input_, begin, size, name=None):。tf.slice()函式的那些引數設定實在是不好理解,查了好多資料才理解,所以這邊記錄一下。 # 1.官方註釋 官方的註釋如下: ```p
Linux檔案操作詳解(七)--資料夾的建立(mkdir命令)
一、mkdir命令簡介 mkdir命令用來建立目錄。該命令建立由dirname命名的目錄。如果在目錄名的前面沒有加任何路徑名,則在當前目錄下建立由dirname指定的目錄;如果給出了一個已經存在的路徑,將會在該目錄下建立一個指定的目錄。在建立目錄時,應保證新建
hashmap資料結構詳解(五)之HashMap、HashTable、ConcurrentHashMap 的區別
【hashmap 與 hashtable】 hashmap資料結構詳解(一)之基礎知識奠基 hashmap資料結構詳解(二)之走進JDK原始碼 hashmap資料結構詳解(三)之hashcode例項及大小是2的冪次方解釋 hashmap資料結構詳解(四)之has
C/C++堆、棧及靜態資料區詳解(轉載只是為了查閱方便,若侵權立刪)
C/C++堆、棧及靜態資料區詳解 本文介紹C/C++中堆,棧及靜態資料區。 五大記憶體分割槽 在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。下面分別來介紹: 棧,就是那些由編譯器在需要的時候分配,在不需要
HTML對字型的所有操作詳解(經典)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
matlab對影象操作函式的詳解(筆記1)
matlab對影象操作函式的詳解 一. 讀寫影象檔案 1. imread imread函式用於讀入各種影象檔案,如:a=imread('e:\w01.tif') 注:計算機E盤上要有w01相應的.tif檔案。 2. imwrite imwrite函式用於寫入影象檔案,如:im
Tire樹(字典樹)資料結構詳解(圖解)及模板
先在這裡放模板,具體圖解回去再發 #include <map> #include <queue> #include <cstdlib> #include <cm
連結串列的插入和刪除操作詳解(C語言實現+詳解註釋)
連結串列的基本操作中,連結串列結點的插入和刪除相對比較複雜,需根據結點插入位置的不同,使用合理的方法在不破壞原連結串列結構的前提下將其插入到連結串列中。 本節將詳解介紹這兩種操作的具體實現方法,讀者只需牢記實現步驟,即可輕鬆解決這兩大難點。 連結串列中插入結點 連結串列中插入結點,根據插入位置的不同,可
靜態連結串列插入和刪除操作詳解(C語言程式碼實現)
本節主要講解靜態連結串列的插入和刪除操作,有關靜態連結串列的詳細講解請閱讀《靜態連結串列及C語言實現》一文。 在講解靜態連結串列的插入和刪除操作之前,我們假設有如下的靜態連結串列: 圖中,array[0] 用作備用連結串列的頭結點,array[1] 用作存放資料的連結串列的頭結點,array[0]
哨兵2資料‘檔名’詳解(吐血整體,僅供參考)
哨兵2資料檔名詳解 Sentinel-2 Level-1C products: (2016年12月6日之後生成的Sentinel-2 Level-1C產品的新格式命名約定) .zip解壓後為.SAFE檔案 S2A_MSIL1C_20170105T013442_
HBase基本資料操作詳解【完整版,絕對精品】
引言 之前詳細寫了一篇HBase過濾器的文章,今天把基礎的表和資料相關操作補上。 本文件參考最新(截止2014年7月16日)的官方Ref Guide、Developer API編寫。 所有程式碼均基於“hbase 0.96.2-hadoop2”版本編寫,均實測通過。 歡迎轉載
C++文件操作詳解(ifstream、ofstream、fstream)
轉自:http://www.cnblogs.com/azraelly/archive/2012/04/14/2446914.html C++ 通過以下幾個類支援文件的輸入輸出: ofstream: 寫操作(輸出)的文件類 (由ostream引申而來) ifstr
MySQL(九)之資料表的查詢詳解(SELECT語法)二
上一篇講了比較簡單的單表查詢以及MySQL的組函式,這一篇給大家分享一點比較難得知識了,關於多表查詢,子查詢,左連線,外連線等等。希望大家能都得到幫助! 在開始之前因為要多表查詢,所以搭建好環境: 1)建立資料表suppliers 前面已經有一張表是book表,我們