hive建表並load資料小結

來源:互聯網
上載者:User

標籤:des   blog   http   io   os   使用   ar   for   檔案   

一、建表的時候要指明分隔字元 

hive建表時預設的分隔字元是‘\001‘,若在建表的時候沒有指明分隔字元,load檔案的時候檔案的分隔字元需要是‘\001‘的,

若檔案分隔字元不是‘\001‘,程式不會報錯,但表查詢的結果會全部為‘NULL‘,

如何製作分隔字元為‘\001‘的測試檔案

用vi編輯器Ctrl+v然後Ctrl+a就可以通過鍵盤輸入‘\001‘

也可以在建表的時候指明分隔字元為定位字元,然後測試檔案用excel定位字元製作,

例如:

create table pokes(foo INT,bar STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘ LINES TERMINATED BY ‘\n‘ STORED AS TEXTFILE; 

LOAD DATA local inpath ‘/root/pokes.txt‘ INTO TABLE pokes;其中 pokes.txt檔案需要用excel製作定位字元為分隔字元,否則程式不會報錯,但表查詢的結果會全部為‘NULL‘

二、替換分隔字元

若待匯入的檔案的分隔字元與表的分隔字元不一致,或者需要替換hive匯出檔案欄位預設分隔符號:

Hive建表的時候雖然可以指定欄位分隔符號,不過用insert overwrite local directory這種方式匯出檔案時,欄位的分割符會被預設置為\001,一般都需要將欄位分隔符號轉換為其它字元,可以使用下面的命令:

     sed -e ‘s/\x01/|/g‘ file 

可以將|替換成自己需要的分隔字元,file為hive匯出的檔案。

例如:

 


三 複雜類型的資料表,這裡列之間以‘\t‘分割,數組元素之間以‘,‘分割

 #資料檔案內容如下

 1 huangfengxiao   beijing,shanghai,tianjin,hangzhou

 2 linan   changchu,chengdu,wuhan

 

 hive> create table complex(name string,work_locations array)

     > ROW FORMAT DELIMITED

     > FIELDS TERMINATED BY ‘\t‘

     > COLLECTION ITEMS TERMINATED BY ‘,‘;

 hive> describe complex;

 OK

 name    string

 work_locations  array

 hive> LOAD DATA LOCAL INPATH ‘/home/hadoop/hfxdoc/complex.txt‘ OVERWRITE INTO TABLE complex

 hive> select * from complex;                                                                

 OK

 huangfengxiao   ["beijing","shanghai","tianjin","hangzhou"]

 linan   ["changchu","chengdu","wuhan"]

 Time taken: 0.125 seconds

 hive> select name, work_locations[0] from complex;

 MapReduce Total cumulative CPU time: 790 msec

 Ended Job = job_201301211420_0012

 MapReduce Jobs Launched: 

 Job 0: Map: 1   Cumulative CPU: 0.79 sec   HDFS Read: 296 HDFS Write: 37 SUCCESS

 Total MapReduce CPU Time Spent: 790 msec

 OK

 huangfengxiao   beijing

 linan   changchu

 Time taken: 20.703 seconds

四如何分區?

 表class(teacher sting,student string,age int)

 Mis li huangfengxiao 20

 Mis li lijie 21

 Mis li dongdong 21

 Mis li liqiang 21

 Mis li hemeng 21

 Mr xu dingding 19

 Mr xu wangqiang 19

 Mr xu lidong 19

 Mr xu hexing 19

 如果我們將這個班級成員的資料按teacher來分區

 create table classmem(student string,age int) partitioned by(teacher string)

 分區檔案

 classmem_Misli.txt

  huangfengxiao 20  

  lijie 21          

  dongdong 21  

  liqiang 21          

  hemeng 21 

 classmem_MrXu.txt

  dingding 19 

  wangqiang 19 

  lidong 19         

  hexing 19   

 LOAD DATA LOCAL INPATH ‘/home/hadoop/hfxdoc/classmem_Misli.txt‘ INTO TABLE classmem partition (teacher = ‘Mis.li‘)

 LOAD DATA LOCAL INPATH ‘/home/hadoop/hfxdoc/classmem_MrXu.txt‘ INTO TABLE classmem partition (teacher = ‘Mis.Xu‘)

 

 #分區列被預設到最後一列

 hive> select * from classmem where teacher = ‘Mr.Xu‘;

 OK

 dingding        19      NULL    Mr.Xu

 wangqiang       19      NULL    Mr.Xu

 lidong  19              NULL    Mr.Xu

 hexing  19      NULL    Mr.Xu

 Time taken: 0.196 seconds

 #直接從分區檢索,加速;如果where子句的條件不是分區列,那麼,這個sql將被編譯成mapreduce程式,延時很大。

 #所以,我們建立分區,是為了一些常用的篩選查詢欄位而用的。

五桶的使用?更高效!可取樣!主要用於大資料集的取樣

 桶的原理是對一個表(或者分區)進行切片,選擇被切片的欄位,設定桶的個數,用欄位與個數的hash值進行入桶。

 比如bucket.txt資料檔案內容如下:

 id name age

 1 huang 11

 2 li 11

 3 xu 12

 4 zhong 14

 5 hu 15

 6 liqiang 17

 7 zhonghua 19

 如果我們想將這個資料表切成3個桶,切片欄位為id

 那麼用id欄位hash後,3個桶的內容如下:

 桶id hash 3 =0

 3 xu 12

 6 liqiang 17

 桶id hash 3 =1

 1 huang 11

 4 zhong 14

 7 zhonghua 19

 桶id hash 3 =2

 2 li 11

 5 hu 15

 這個過程的建立表語句如下:

 create table bucketmem (id int,name string,age int) CLUSTERED BY (id) sorted by (id asc) into 3 buckets

 ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘;

 LOAD DATA LOCAL INPATH ‘/home/hadoop/hfxdoc/bucketmem.txt‘ INTO TABLE bucketmem;

 select * from bucketmem tablesample(bucket 1 out of 4)

六其他動作參考,更完整的請參考官網: https://cwiki.apache.org/confluence/display/Hive/Home

 1) 建立與已知表相同結構的表Like:

 只複製表的結構,而不複製表的內容。

 create table test_like_table like test_bucket;

 2) 對錶進行重新命名 rename to:

 ALTER TABLE table_name RENAME TO new_table_name

 3) 增加分區 Add Partitions:

 ALTER TABLE table_name ADD partition_spec [ LOCATION ‘location1‘ ]partition_spec [ LOCATION ‘location2‘ ]

 4) 對錶中的某一列進行修改,包括列的名稱/列的資料類型/列的位置/列的注釋

 ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type[COMMENT col_comment] [FIRST|AFTER column_name]

 5) 添加/替換列Add/ReplaceColumns

 ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENTcol_comment], ...)

 ADD COLUMNS 允許使用者在當前列的末尾增加新的列,但是在分區列之前。


hive建表並load資料小結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.