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