Hive 5 HiveQL 資料操作

2022-01-22 13:59:26 字數 3921 閱讀 1838

5.1 向管理表中裝載資料

hive 沒有行級別的資料插入更新和刪除操作,那麼往表中裝載資料的唯一途徑就是使用一種「大量」的資料裝載操作,或者通過其他方式僅僅將檔案寫入到正確的目錄下;

load data local inpath '$/califonia-employees'

overwrite inot table employees  

partiton (country=''us, state='ca') ;

向管理表中裝載資料,如果目錄不存在的話, overwrite 會先建立分割槽目錄,然後再將資料拷貝到該目錄 ;如果是非分割槽表則應該省略 partition 後面的語句;

通常情況下指定的路徑應該是乙個目錄,而不是乙個單個獨立的檔案,hive 會將所有的檔案都拷貝到這個目錄中;

inpath 子句中使用的檔案路徑還有乙個限制,就是這個路徑下可能 包含任何資料夾;

注意:如果使用了 local 關鍵字,這個路徑應該為本地檔案系統路徑,資料將會被拷貝驪目標位置,如果省略掉 local關鍵字,那這個路徑應該是分布式檔案系統中的路徑,這咱情況資料是從這個路徑轉移到目標位置;

load data local 。。。 拷貝本地資料到位於分布式檔案系統上的目標位置;

load data 。。。轉移資料到目標位置;

注意:hive 要求原始檔和目標檔案以及目錄應該在同個檔案系統中,使用者不可以使用 local data 語句將資料從乙個集群的 hdfs 中轉移 到另乙個集群的 hdfs 中;

指定全路徑會具有更好的魯棒性,但也同樣支援相驛路徑,當使用本地模式執行時,相對路徑相對的是當 hive cli 啟動時使用者的工作目錄,對於分布式或者偽分布式模式,這個路徑解讀為相對於分布式檔案系統中使用者的根目錄,該目錄在 hdfs 和 maprfs中預設為 /user/$user;

如果使用者指定了 overwrite 關鍵字,那麼目標資料夾中之前存在的資料將會被先刪除掉,如果沒有,僅僅會把新增的檔案增加到目標資料夾中而不會刪除之前的資料。如果目標資料夾中的檔案已經存在和裝載的檔案同名的檔案,那麼舊的同名檔案將會被覆蓋重寫;

如果目錄是分割槽表,那麼需要使用 partiton 子句,而且使用者還必須為每個分割槽的鍵指定乙個值 ;

hive 並不會驗證使用者裝載的資料和表的模式是否匹配,但會驗證檔案格式是否和表結構定義的一致;(如儲存格式為 sequencefile v,那麼裝載進去的格式也必須為這種)

5.2 通過查詢語句向表中插入資料

insert overwrite table employees partition(country='us',state='or')

select * from staged_employees se where se.cnty='us' and se.st='or'

overwrite 關鍵字會將以前分割槽之中的內容覆蓋掉,如果改成 inot 則會以追加的方式寫入資料;(0.8.0以後的版本才有)

from staged_employees se

insert overwrite table employees

patrition(country='us',state='or')

select * where se.cnty='us' and se.st='or'

insert overwrite table employees

patrition(country='us',state='ca')

select * where se.cnty='us' and se.st='ca'

insert overwrite table employees

patrition(country='us',state='il')

select * where se.cnty='us' and se.st='il'

以上語句可以只掃瞄一次表 staged_employees 就可以做多次插入其他表

動態分割槽插入

insert overwrite table employees

partition(country,state)

select ...,se.cnty,  se.st

from staged_employees se;

hive 會根據 select 語句中最後2列來確定分割槽字段 counrty 和 state 的值

insert overwrite table employees partition (country='us',state)

select ..., se.cnty,se.st from staged_employees se where se.cnty='us'

靜態+動態分割槽聯合使用

【注意:靜態分割槽必須出現在動態分割槽之前,而且動態分割槽預設情況下是沒有開啟的,開啟後預設是以「嚴格」模式執行的,在這種模式下要求至少有一列分割槽欄位是靜態的,這有助於阻止因設計錯誤導致查詢產生大量的分割槽】

動態分割槽屬性 【可以用 set 屬性=值  來進行設定】 屬性    預設值     說明 

hive.exec.dynamic.partition    false     設定成 true 表示開啟動態分割槽功能

hive.exec.dynamic.partition.mode    strict    設定成 nonstrict 表示允許所有分割槽都是動態的

hive.exec.max.dynamic.partitions    +1000    乙個動態分割槽建立語句可以建立的最大動態分割槽個數,如果超過出報錯

hive.exec.max.created.files     100000    全域性可以最大檔案個數,如果超過會報錯

5.3 單個查詢語句中建立表並載入資料 【本功能不能使用於外部表】

create table ca_employees as select name,salary,address from employees where se.state='ca' ;

5.4 匯出資料

hadoop fs -cp source_path target_path 直接用 hadopp 命令匯出語句

insert overwrite local directory '/tmp/ca_employees'    --最後面的路徑也可以寫成 url 路徑(hdfs://master-server/tmp/ca_employees)

select name, salary, address from employees where se.state ='ca';  乙個或多個檔案將會被儲存到 /tmp/ca_employees 目錄下,不管hive 表中資料實際是怎麼儲存的,hive 會將所有的字段序列化成字串寫入到檔案中,hive 會使用和 hive 內部儲存的表相同的編碼方式來生成輸出檔案。

hive> ! ls /tmp/ca_employees;  在hive裡執行bash命令檢視檔案

使用者也可以和向表中插入資料一樣,通過以下方式指定多個輸出資料夾目錄:

from staged_employees se

insert overwrite directory '/tmp/or_employees'

patrition(country='us',state='or')

select * where se.cnty='us' and se.st='or'

insert overwrite directory '/tmp/ca_employees'

patrition(country='us',state='ca')

select * where se.cnty='us' and se.st='ca'

insert overwrite directory '/tmp/il_employees'

patrition(country='us',state='il')

select * where se.cnty='us' and se.st='il'

Hive學習 HiveQL 資料定義

hiveql可能和mysql語句接近,但是兩者還是存在顯著差異。hive不支援行級插入操作 更新操作和刪除操作。hive也不支援事務。建立資料庫 create database financials 檢視hive中包含的資料庫 show databases 使用正則匹配篩選出需要的資料庫 show ...

HiveQL的DML操作(二) 資料匯出

本篇整理從hive表中匯出資料的各種操作,包括將hive表匯出到本地 hdfs和mysql三種目標路徑。資料操縱語言 data manipulation language,dml 目錄 1.insert overwrite匯出到本地 hdfs 1 將表查詢結果匯出到本地檔案 2 將表查詢結果格式化匯...

hive資料操作

select from employees 在這種情況下可以簡單的讀取employees對應的儲存目錄下的檔案,然後輸出到格式化後的內容到控制台 對於where語句中的過濾條件只是分割槽字段這種情況 無論是否使用limit語句限制輸出記錄數 也無需mapreduce過程的 select from e...