hive建表并load数据小结

一、建表的时候要指明分隔符

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 允许用户在当前列的末尾增加新的列,但是在分区列之前。

时间: 2024-12-31 21:40:00

hive建表并load数据小结的相关文章

Hive建表-分隔符

在hive建表中,默认的分隔符为  ‘,’ ,可以指定想用的分隔符 hive默认的列分割类型为org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,这其实就是^A分隔符,hive中默认使用^A(ctrl+A)作为列分割符,如果用户需要指定的话,等同于row format delimited fields terminated by '\001',因为^A八进制编码体现为'\001'.所以如果使用默认的分隔符,可以什么都不加,也可以按照上面的指定加‘

hive建表与数据的导入导出

建表: create EXTERNAL table tabtext(IMSI string,MDN string,MEID string,NAI string,DestinationIP string,DestinationPort string,SourceIP string,SourcePort string,PDSNIP string,PCFIP string,HAIP string,UserZoneID string,BSID string,Subnet string,ServiceOp

hive建表没使用LZO存储格式,可是数据是LZO格式时遇到的问题

今天微博大数据平台发邮件来说.他们有一个hql执行失败.可是从gateway上面的日志看不出来是什么原因导致的,我帮忙看了一下.最后找到了问题的解决办法,下面是分析过程: 1.执行失败的hql: INSERT OVERWRITE TABLE brand_ad_user_with_interact_score_3 select a.uid, a.brand, a.friend, CASE b.weight WHEN NULL THEN '0.000000' ELSE b.weight END fr

hive建表没使用LZO存储格式,但是数据是LZO格式时遇到的问题

今天微博大数据平台发邮件来说,他们有一个hql运行失败,但是从gateway上面的日志看不出来是什么原因导致的,我帮忙看了一下,最后找到了问题的原因,以下是分析过程: 1.运行失败的hql: INSERT OVERWRITE TABLE brand_ad_user_with_interact_score_3 select a.uid, a.brand, a.friend, CASE b.weight WHEN NULL THEN '0.000000' ELSE b.weight END from

hive建表语句

原文:http://jingyan.baidu.com/article/a378c96092cf56b328283006.html 创建表的语句:Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_com

hive建表

1.建表 Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name ( [(col_name data_type [COMMENT col_comment], ...)] )   [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED B

50个查询系列-建表和插入数据

为了练习sql语句,需要先建表: 需要建立如下的表格: tabstudent和tblteacher都是普通的表,但是talscore和tablcourse都要有主外键的关系.各自的建表语句如下: tblteacher表: CREATE TABLE `tblteacher` ( `TeaId` VARCHAR(3) NOT NULL, `TeaName` VARCHAR(20) CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`TeaId`) ) ENGINE=

数据库语句之建表、拷贝数据表

1.数据库建表语句 create table tb_People(id integer primary key, Name varchar(255), Sex varchar(255)) 2.同数据库拷贝数据表 sql: insert into table1 select*from table2(完全拷贝) insert into table1 select distinct*from table2(不重复拷贝); insert into table1 select top 10*from ta

(笔记)Mysql实例:建库建表并插入数据2

drop database if exists school;  // 如果存在SCHOOL则删除create database school;  // 建立库SCHOOLuse school;  // 打开库SCHOOLcreate table teacher(  // 建立表TEACHER    id int(3) auto_increment not null primary key,    name char(10) not null,    address varchar(50) de