3.HIve中導入、導出數據的幾種方式


一、往HIVE表中導入導出數據

  1.建表時直接導入:

  如果你的數據已經在HDFS上存在,已經為結構化數據,並且數據所在的HDFS路徑不需要維護,那么可以直接在建表的時候使用location指定數據所在的HDFS路徑即可

CREATE [EXTERNAL] TABLE t_lxw1234 (
day STRING,
url STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' 
stored as textfile 
location '/tmp/aaa.txt/';

  2.使用load,語法結構:  [ ]帶括號的表示可選擇字段

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO
TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

  各參數說明:

  1 -hive只對導入該表中的數據按照自己的方式 處理,對於錯誤的數據不管,超出直接丟棄。
  2 - Load 操作只是單純的復制/移動操作,將數據文件移動到 Hive 表對應的位置。 所以也可以直接hadoop fs -put   ./1.txt   /user/hive/warehouse/web_log.db/staff/ 將數據直接導入到hive表對應的位置。hive對  導入的數據沒有查錯的功能,只是按自己的表字段進行匹配,格式匹配不了的默認用Null替代, hive屬於讀時模式。
  3 - LOCAL關鍵字, 如果指定了 LOCAL, load 命令會去查找本地文件系統中的 filepath。 如果沒有指定 LOCAL 關鍵字,則根據inpath中的uri查找文件
  4 - OVERWRITE 關鍵字, 如果使用了 OVERWRITE 關鍵字,則目標表(或者分區)中的 內容會先被全部被刪除 ,然后再將 filepath 指向的文件/目錄中的內容添加到表/分區中。 如果目標表(分區)已經有  一個文件,並且文件名和 filepath 中的文件名沖突,那么現有的文件會被新文件所替代。

  詳細語法結構

1、本地導入(本地導入以后1.txt文件本地還有備份的,且這里是增量表插入(不覆蓋))

load data local inpath 'local_path/file' into table 表名稱 ;
ex: load data local inpath ./1.txt into table staff;

2、HDFS導入(導入完以后hdfs上的1.txt文件就不存在了,且這里是增量表插入(不覆蓋))

load data inpath 'hdfs_path/file' into table 表名稱 ;
ex: load data inpath '/user/jerry.txt' into table jerry;  -- 不能少了單引號
load data inpath 'hdfs://hadoop102:8020/user/jerry.txt' into table jerry;

3,覆蓋導入:本地文件導入,hdfs文件導入加了overwrite參數而已(原有數據會被清除掉 重新插入新數據)

1. load data local inpath 'path/file' overwrite into table 表名稱 ;  -- 從Linux本地系統導入
ex: load data local inpath ./1.txt ovewrite into table staff;
2.load data inpath 'path/file' overwrite into table 表名稱 ;  -- 從hdfs上導入
ex:load data inpath '/user/jerry.txt' overwrite into table jerry;

4、查詢導入(其實就是創建新表)

create table track_log_bak as select * from db_web_data.track_log;

5、insert查詢結果插入hive中(insert導入必須基於別的表查詢導入的)將查詢結果插入Hive表

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]
select_statement1 FROM from_statement

覆蓋-overwrite-顯示指定-使用頻率高
追加-append-默認方式 (用into)
ex: insert into table staff (這里沒有as) select * from track_log;
ex: insert overwrite table staff2 select id,name from staff where id<100;

 

二、從Hive表導出數據方式(也是查詢方式導出,跟導入區別insert后面一個是table,一個是directory)

  1、hive中數據導出到本地

  標准語法 :

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
例如:insert overwrite local directory "/home/admin/Desktop/1/2"
row format delimited fields terminated by '\t'
select * from db_hive_demo.emp ;(row 這一行可以不加)

  注意:會遞歸創建目錄,一定要選擇文件夾,否則會覆蓋目錄,造成數據丟失

  2、insert查詢結果導出到HDFS

insert overwrite directory 'hdfs://hadoop102:8020/user/hive/warehouse/emp2/emp2'
select * from emp where empno >7800;

  3、Bash shell覆蓋追加導出

$ bin/hive -e "select * from staff;" > /home/z/backup.log

  4、Sqoop把hive數據導出到外部


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM