hive建表並load數據小結

1、建表的時候要指明分隔符 html

hive建表時默認的分隔符是'\001',若在建表的時候沒有指明分隔符,load文件的時候文件的分隔符須要是'\001'的,sql

若文件分隔符不是'\001',程序不會報錯,但表查詢的結果會所有爲'NULL',apache

如何製做分隔符爲'\001'的測試文件數組

用vi編輯器Ctrl+v而後Ctrl+a就能夠經過鍵盤輸入'\001'編輯器

也能夠在建表的時候指明分隔符爲製表符,而後測試文件用excel製表符製做,oop

例如:測試

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'url

2、替換分隔符excel

若待導入的文件的分隔符與表的分隔符不一致,或者須要替換hive導出文件字段默認分隔符:

Hive建表的時候雖然能夠指定字段分隔符,不過用insert overwrite local directory這種方式導出文件時,字段的分割符會被默認置爲\001,通常都須要將字段分隔符轉換爲其它字符,可使用下面的命令:

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

能夠將|替換成本身須要的分隔符,file爲hive導出的文件。

例如:

 hive建表並load數據小結


三 複雜類型的數據表,這裏列之間以'\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 容許用戶在當前列的末尾增長新的列,可是在分區列以前。

相關文章
相關標籤/搜索