Hive的幾種常見的數據導入方式


這里介紹四種:
(1)、從本地文件系統中導入數據到Hive表;
(2)、從HDFS上導入數據到Hive表;
(3)、從別的表中查詢出相應的數據并導入到Hive表中;
(4)、在創建表的時候通過從別的表中查詢出相應的記錄并插入到所創建的表中。


一、從本地文件系統中導入數據到Hive表


先在Hive里面創建好表,如下:
  1. hive> create table wyp
  2. ? ? > (id int, name string,
  3. ? ? > age int, tel string)
  4. ? ? > ROW FORMAT DELIMITED
  5. ? ? > FIELDS TERMINATED BY '\t'
  6. ? ? > STORED AS TEXTFILE;
  7. OK
  8. Time taken: 2.832 seconds
復制代碼

這個表很簡單,只有四個字段,具體含義我就不解釋了。本地文件系統里面有個/home/wyp/wyp.txt文件,內容如下:
  1. [wyp@master ~]$ cat wyp.txt
  2. 1? ?? ? wyp? ???25? ?? ?13188888888888
  3. 2? ?? ? test? ? 30? ?? ?13888888888888
  4. 3? ?? ? zs? ?? ?34? ?? ?899314121
復制代碼

wyp.txt文件中的數據列之間是使用\t分割的,可以通過下面的語句將這個文件里面的數據導入到wyp表里面,操作如下:
  1. hive> load data local inpath 'wyp.txt' into table wyp;
  2. Copying data from file:/home/wyp/wyp.txt
  3. Copying file: file:/home/wyp/wyp.txt
  4. Loading data to table default.wyp
  5. Table default.wyp stats:
  6. [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 67]
  7. OK
  8. Time taken: 5.967 seconds
復制代碼

這樣就將wyp.txt里面的內容導入到wyp表里面去了,可以到wyp表的數據目錄下查看,如下命令:

  1. hive> dfs -ls /user/hive/warehouse/wyp ;
  2. Found 1 items
  3. -rw-r--r--3 wyp supergroup 67 2014-02-19 18:23 /hive/warehouse/wyp/wyp.txt
復制代碼

需要注意的是:

和我們熟悉的關系型數據庫不一樣,Hive現在還不支持在insert語句里面直接給出一組記錄的文字形式,也就是說,Hive并不支持INSERT INTO …. VALUES形式的語句。

二、HDFS上導入數據到Hive表


  從本地文件系統中將數據導入到Hive表的過程中,其實是先將數據臨時復制到HDFS的一個目錄下(典型的情況是復制到上傳用戶的HDFS home目錄下,比如/home/wyp/),然后再將數據從那個臨時目錄下移動(注意,這里說的是移動,不是復制!)到對應的Hive表的數據目錄里面。既然如此,那么Hive肯定支持將數據直接從HDFS上的一個目錄移動到相應Hive表的數據目錄下,假設有下面這個文件/home/wyp/add.txt,具體的操作如下:
  1. [wyp@master /home/q/hadoop-2.2.0]$ bin/hadoop fs -cat /home/wyp/add.txt
  2. 5? ?? ? wyp1? ? 23? ?? ?131212121212
  3. 6? ?? ? wyp2? ? 24? ?? ?134535353535
  4. 7? ?? ? wyp3? ? 25? ?? ?132453535353
  5. 8? ?? ? wyp4? ? 26? ?? ?154243434355
復制代碼

上面是需要插入數據的內容,這個文件是存放在HDFS上/home/wyp目錄(和一中提到的不同,一中提到的文件是存放在本地文件系統上)里面,我們可以通過下面的命令將這個文件里面的內容導入到Hive表中,具體操作如下:

  1. hive> load data inpath '/home/wyp/add.txt' into table wyp;
  2. Loading data to table default.wyp
  3. Table default.wyp stats:
  4. [num_partitions: 0, num_files: 2, num_rows: 0, total_size: 215]
  5. OK
  6. Time taken: 0.47 seconds

  7. hive> select * from wyp;
  8. OK
  9. 5? ?? ? wyp1? ? 23? ?? ?131212121212
  10. 6? ?? ? wyp2? ? 24? ?? ?134535353535
  11. 7? ?? ? wyp3? ? 25? ?? ?132453535353
  12. 8? ?? ? wyp4? ? 26? ?? ?154243434355
  13. 1? ?? ? wyp? ???25? ?? ?13188888888888
  14. 2? ?? ? test? ? 30? ?? ?13888888888888
  15. 3? ?? ? zs? ?? ?34? ?? ?899314121
  16. Time taken: 0.096 seconds, Fetched: 7 row(s)
復制代碼

從上面的執行結果我們可以看到,數據的確導入到wyp表中了!請注意load data inpath ‘/home/wyp/add.txt’ into table wyp;里面是沒有local這個單詞的,這個是和一中的區別。

三、從別的表中查詢出相應的數據并導入到Hive表中


假設Hive中有test表,其建表語句如下所示:

  1. hive> create table test(
  2. ? ? > id int, name string
  3. ? ? > ,tel string)
  4. ? ? > partitioned by
  5. ? ? > (age int)
  6. ? ? > ROW FORMAT DELIMITED
  7. ? ? > FIELDS TERMINATED BY '\t'
  8. ? ? > STORED AS TEXTFILE;
  9. OK
  10. Time taken: 0.261 seconds
復制代碼

大體和wyp表的建表語句類似,只不過test表里面用age作為了分區字段。對于分區,這里在做解釋一下:
分區:在Hive中,表的每一個分區對應表下的相應目錄,所有分區的數據都是存儲在對應的目錄中。比如wyp表有dt和city兩個分區,則對應dt=20131218,city=BJ對應表的目錄為/user/hive/warehouse/dt=20131218/city=BJ,所有屬于這個分區的數據都存放在這個目錄中。

下面語句就是將wyp表中的查詢結果并插入到test表中:
  1. hive> insert into table test
  2. ? ? > partition (age='25')
  3. ? ? > select id, name, tel
  4. ? ? > from wyp;
  5. #####################################################################
  6. ? ?? ?? ???這里輸出了一堆Mapreduce任務信息,這里省略
  7. #####################################################################
  8. Total MapReduce CPU Time Spent: 1 seconds 310 msec
  9. OK
  10. Time taken: 19.125 seconds

  11. hive> select * from test;
  12. OK
  13. 5? ?? ? wyp1? ? 131212121212? ? 25
  14. 6? ?? ? wyp2? ? 134535353535? ? 25
  15. 7? ?? ? wyp3? ? 132453535353? ? 25
  16. 8? ?? ? wyp4? ? 154243434355? ? 25
  17. 1? ?? ? wyp? ???13188888888888??25
  18. 2? ?? ? test? ? 13888888888888??25
  19. 3? ?? ? zs? ?? ?899314121? ?? ? 25
  20. Time taken: 0.126 seconds, Fetched: 7 row(s)
復制代碼
這里做一下說明:
我們知道我們傳統數據塊的形式insert into table values(字段1,字段2),這種形式hive是不支持的。

通過上面的輸出,我們可以看到從wyp表中查詢出來的東西已經成功插入到test表中去了!如果目標表(test)中不存在分區字段,可以去掉partition (age=’25′)語句。當然,我們也可以在select語句里面通過使用分區值來動態指明分區:
  1. hive> set hive.exec.dynamic.partition.mode=nonstrict;
  2. hive> insert into table test
  3. ? ? > partition (age)
  4. ? ? > select id, name,
  5. ? ? > tel, age
  6. ? ? > from wyp;
  7. #####################################################################
  8. ? ?? ?? ???這里輸出了一堆Mapreduce任務信息,這里省略
  9. #####################################################################
  10. Total MapReduce CPU Time Spent: 1 seconds 510 msec
  11. OK
  12. Time taken: 17.712 seconds


  13. hive> select * from test;
  14. OK
  15. 5? ?? ? wyp1? ? 131212121212? ? 23
  16. 6? ?? ? wyp2? ? 134535353535? ? 24
  17. 7? ?? ? wyp3? ? 132453535353? ? 25
  18. 1? ?? ? wyp? ???13188888888888??25
  19. 8? ?? ? wyp4? ? 154243434355? ? 26
  20. 2? ?? ? test? ? 13888888888888??30
  21. 3? ?? ? zs? ?? ?899314121? ?? ? 34
  22. Time taken: 0.399 seconds, Fetched: 7 row(s)
復制代碼

這種方法叫做動態分區插入,但是Hive中默認是關閉的,所以在使用前需要先把hive.exec.dynamic.partition.mode設置為nonstrict。當然,Hive也支持insert overwrite方式來插入數據,從字面我們就可以看出,overwrite是覆蓋的意思,是的,執行完這條語句的時候,相應數據目錄下的數據將會被覆蓋!而insert into則不會,注意兩者之間的區別。例子如下:

  1. hive> insert overwrite table test
  2. ? ? > PARTITION (age)
  3. ? ? > select id, name, tel, age
  4. ? ? > from wyp;
復制代碼

更可喜的是,Hive還支持多表插入,什么意思呢?在Hive中,我們可以把insert語句倒過來,把from放在最前面,它的執行效果和放在后面是一樣的,如下:
  1. hive> show create table test3;
  2. OK
  3. CREATE??TABLE test3(
  4. ??id int,
  5. ??name string)
  6. Time taken: 0.277 seconds, Fetched: 18 row(s)

  7. hive> from wyp
  8. ? ? > insert into table test
  9. ? ? > partition(age)
  10. ? ? > select id, name, tel, age
  11. ? ? > insert into table test3
  12. ? ? > select id, name
  13. ? ? > where age>25;

  14. hive> select * from test3;
  15. OK
  16. 8? ?? ? wyp4
  17. 2? ?? ? test
  18. 3? ?? ? zs
  19. Time taken: 4.308 seconds, Fetched: 3 row(s)
復制代碼

可以在同一個查詢中使用多個insert子句,這樣的好處是我們只需要掃描一遍源表就可以生成多個不相交的輸出。這個很酷吧!

四、在創建表的時候通過從別的表中查詢出相應的記錄并插入到所創建的表中


在實際情況中,表的輸出結果可能太多,不適于顯示在控制臺上,這時候,將Hive的查詢輸出結果直接存在一個新的表中是非常方便的,我們稱這種情況為CTAS(create table .. as select)如下:

  1. hive> create table test4
  2. ? ? > as
  3. ? ? > select id, name, tel
  4. ? ? > from wyp;

  5. hive> select * from test4;
  6. OK
  7. 5? ?? ? wyp1? ? 131212121212
  8. 6? ?? ? wyp2? ? 134535353535
  9. 7? ?? ? wyp3? ? 132453535353
  10. 8? ?? ? wyp4? ? 154243434355
  11. 1? ?? ? wyp? ???13188888888888
  12. 2? ?? ? test? ? 13888888888888
  13. 3? ?? ? zs? ?? ?899314121
  14. Time taken: 0.089 seconds, Fetched: 7 row(s)
復制代碼

數據就插入到test4表中去了,CTAS操作是原子的,因此如果select查詢由于某種原因而失敗,新表是不會創建的!


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387680.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387680.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手把手教你開發基于深度學習的人臉識別【考勤/簽到】系統

人臉識別介紹平臺環境需求技術點系統流程細節設計 人臉檢測人臉關鍵點定位人臉特征提取 模型的訓練模型的部署 MySQL數據庫的使用MFC工程的搭建 軟件使用 人臉識別介紹 人臉識別技術是一項非接觸式、用戶友好、非配合型的計算機視覺識別技術。隨著機器學習、深度學習等技術的發…

重學前端學習筆記(二十二)--選擇器的機制

筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以加入winter的專欄學習【原文…

Windows+VS2013爆詳細Caffe編譯安裝教程

1. 安裝cuda Cuda是英偉達推出的GPU加速運算平臺 我這里安裝的是cuda7.5,已經安裝過的忽略,還沒有安裝過的這里有安裝教程.windows下面安裝還是非常簡單的. 點擊打開鏈接 (我的顯卡是1080 現在支持cuda8.0 所以我下的是8.0) 2. 下載cuDNN(其實是個壓縮…

CF 526F Max Mex(倍增求LCA+線段樹路徑合并)

Max Mex 題目地址&#xff1a;https://codeforces.com/contest/1084/problem/F然后合并時注意分情況討論&#xff1a; 參考代碼&#xff1a;1 #include<bits/stdc.h>2 using namespace std;3 #define pb push_back4 #define mkp make_pair5 #define fi first6 #define se…

大學剛畢業,零基礎大數據如何入門?

這篇文章中&#xff0c;本文作者將針對三種不同的、想要進入數據科學領域的人群&#xff0c;給出自己的經驗&#xff0c;幫助他們迅速有效入行。無論是軟件工程師、應屆畢業生&#xff0c;還是完全初學者&#xff0c;都要問自己一個關鍵問題&#xff1a;什么樣的職業軌跡最接近…

Opencv EmguCv 基本識別步驟

{//1.灰度化&#xff0c;豎向邊緣檢測//2.自適應二值化處理//3.形態學處理&#xff08;膨脹和腐蝕&#xff09;//4.輪廓查找與篩選Image<Bgr, byte> simage OriImage; //new Image<Bgr, byte>("license-plate.jpg");//Image<Bgr, Byte> simage…

(轉)Java中的守護線程

Java的守護線程與非守護線程 守護線程與非守護線程 最近在看多線程的Timer章節&#xff0c;發現運用到了守護線程&#xff0c;感覺Java的基礎知識還是需要補充。 Java分為兩種線程&#xff1a;用戶線程和守護線程 所謂守護線程是指在程序運行的時候在后臺提供一種通用服務的線程…

vue項目中對axios的全局封裝

項目中接口會很多&#xff0c;個人喜歡創建api文件對請求統一管理1.新建api文件夾&#xff0c;文件夾下創建 axios.js&#xff0c;login.js2. axios.jsimport axios from axiosimport router from ../router //引入路由是為了做重定向&#xff0c;比如沒有登錄過期定向到登錄頁…

輪廓檢測

輪廓&#xff08;Contours&#xff09;&#xff0c;指的是有相同顏色或者密度&#xff0c;連接所有連續點的一條曲線。檢測輪廓的工作對形狀分析和物體檢測與識別都非常有用。 在輪廓檢測之前&#xff0c;首先要對圖片進行二值化或者Canny邊緣檢測。在OpenCV中&#xff0c;尋找…

【大數據】阿里云大數據助理工程師認證(ACA)課程

阿里云大數據助理工程師認證&#xff08;Alibaba Cloud Certified Associate&#xff0c;ACA&#xff09; 是面向使用阿里云大數據產品的專業技術認證&#xff0c;主要涉及阿里云的大數據計算、存儲、開發平臺&#xff0c;數據應用類的基礎產品。是對學員掌握阿里云大數據產品技…

WebGL——osg框架學習一

從今天開始&#xff0c;我們開始正式的學習osg框架&#xff0c;今天我們學習的是osg的渲染模塊&#xff0c;我們來看一下代碼結構。 所有DrawXXX的js模塊都是渲染的模塊&#xff0c;我們逐一來簡單介紹一下&#xff0c;第一個Drawable.js&#xff0c;這個模塊是描述可繪制對象的…

EmguCV 一些基本操作

一、先是在程序中圖像的導入&#xff0c;我是根據圖像路徑實現&#xff0c;其中path是string類型&#xff0c;是圖像路徑。 IntPtr imgCvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR); 二、圖像灰度化處理&#xff0c;先創建一幅尺寸大小…

Java字符串分割

java中字符串的分割函數&#xff0c;split("你想要分割的字符", 你想要最多分割為多少段&#xff0c;正整數&#xff09; 注意事項&#xff1a; 1.分割特殊字符考慮轉義字符的使用。如&#xff1a; . \ | 2.第二個參數&#xff1a; 無&#xff1a; 不傳默認分割全部…

OpenCV人臉識別的原理 .

在之前講到的人臉測試后&#xff0c;提取出人臉來&#xff0c;并且保存下來&#xff0c;以供訓練或識別是用&#xff0c;提取人臉的代碼如下&#xff1a; [html] view plaincopy print?void GetImageRect(IplImage* orgImage, CvRect rectInImage, IplImage* imgRect,double s…

說一下SEO和SEM到底有哪些區別?

開場白免了&#xff0c;我們直接說與主題相關的。 SEO和SEM到底有什么區別&#xff1f; SEO和SEM到底有什么區別 我們先理解字面意思&#xff1a; SEO&#xff08;Search Engine Optimization&#xff09;&#xff1a;漢譯為搜索引擎優化。 SEM&#xff08;Search Engine Marke…

django模型的繼承

很多時候&#xff0c;我們都不是從‘一窮二白’開始編寫模型的&#xff0c;有時候可以從第三方庫中繼承&#xff0c;有時候可以從以前的代碼中繼承&#xff0c;甚至現寫一個模型用于被其它模型繼承。這樣做的好處&#xff0c;我就不贅述了&#xff0c;每個學習Django的人都非常…

SpringBoot部署項目到Docker倉庫

SpringBoot部署項目到Docker倉庫1.開啟遠程控制端口Centos7開啟方式&#xff1a; vim /lib/systemd/system/docker.service找到ExecStart行 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 重啟docker 啟動 systemctl start docker守護進程…

人臉識別經典方法

這篇文章是擼主要介紹人臉識別經典方法的第一篇&#xff0c;后續會有其他方法更新。特征臉方法基本是將人臉識別推向真正可用的第一種方法&#xff0c;了解一下還是很有必要的。特征臉用到的理論基礎PCA在另一篇博客里&#xff1a;特征臉(Eigenface)理論基礎-PCA(主成分分析法)…

Jquery常用正則驗證

常用校驗的正則表達式var rulesConfig { /** * str.replace(/^\s|\s$/g, ) 解析&#xff1a; str&#xff1a;要替換的字符串 \s : 表示 space &#xff0c;空格 &#xff1a; 一個或多個 ^&#xff1a; 開始&#xff0c;^\s&#xff0c;以空格開始 $&#xff1a; 結束&#x…

svm參數說明

svm參數說明---------------------- 如果你要輸出類的概率&#xff0c;一定要有-b參數 svm-train training_set_file model_file svm-predict test_file model_fileoutput_file 自動腳本&#xff1a;Python easy.py train_data test_data 自動選擇最優參數&#xff0c;自動進行…