Hive基本语法使用

标签: hive 语法 | 发表时间:2014-12-17 18:43 | 作者:username2
出处:http://www.iteye.com

 

 

1 创建表以及表的关联查询

2 外部表的使用 

3 复杂数据类型的使用 

4 分区的使用

5 桶的使用与理解 

6 官方文档

https://cwiki.apache.org/confluence/display/Hive/Home

一、 创建表以及表的关联查询

1) 创建表

hive> create table student(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE;

hive> create table ticket(age INT,price FLOAT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE;

 

2)创建本地数据文件 student.txt 和ticket.txt,并加载到hive的数据表中

 内容:

 student.txt文件

huang26

lili25

dongdong27

wangxiao5

 

ticket.txt文件,加载到数据库中每一行多的数据会被忽略掉,少得数据会变成null

2619.0qwe

2510.0er

27

590.0

 

3)加载数据 

 LOAD DATA LOCAL INPATH '/root/student.txt' OVERWRITE INTO TABLE student;

 查看数据是否正确加载: select * from student ;

LOAD DATA LOCAL INPATH '/root/ticket.txt' OVERWRITE INTO TABLE ticket;   

 查看数据是否正确加载: select * from ticket ;

 

4)查看表以及表结构

hive> show tables;

hive> describe student;

 

5) 两个表连接查询(hive编译成MapReduce程序,在hadoop上执行)

 select * from student s  join ticket t on s.age=t.age;

 

 

二、外部表的使用 (对于外部表的删除数据文件不会被删除,只会删除元数据)

1)创建表的文件数据目录

-bash-3.2# hadoop fs -mkdir /tmp/ticket

-bash-3.2# hadoop fs -put /root/person.txt  /tmp/ticket 

-bash-3.2# hadoop fs -put /root/ticket.txt /tmp/ticket

-bash-3.2# hadoop fs -ls /tmp/ticket

2)创建外部表

 create external table student_ext(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE LOCATION '/tmp/ticket'

3) 数据确认

  select * from student_ext 查询到上面两个文件内容全都倒表student_ext中了

  结论:一个路径对应的应该是一个表关联的数据文件, 有其他的文件,则默认文件中数据也会导入到

  这个外部表中,没数据的列会为NULL,多出来的数据会被忽略 

4)

 

三、复杂数据类型的使用  

这里列之间以'\t'分割,数组元素之间以','分割 

数据文件内容:

huangfengbeijing,shanghai,tianjin,guangzhou

linanchangchu,chengdu,wuhan

 

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

       ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

       COLLECTION ITEMS TERMINATED BY ',';

 

加载数据:

LOAD DATA LOCAL INPATH '/root/complex.txt' OVERWRITE INTO TABLE complex 

确认数据是否在:

select * from complex; 

 

查询数组第一个数据:

select name,work_locations[0] from complex; 

结果:

huangfengxiao   beijing

linan   changchu

 

四、分区使用 

 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

1) 用处:上面数据  是老师 、学生、年龄 ,如果按教师分区的话,在查询的时候可以直接分区查询  

 

2) 分区文件:

 classmem_Misli.txt

dingding19

wangqiang19

lidong19

hexing19

 classmem_MrXu.txt

dingding19

wangqiang19

lidong19

hexing19

 

3) 创建表

create table classmem(student string,age int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\'  partitioned by(teacher string)

 

3) 数据导入-分区名称为查询表的最后一列,执行select * from classmem;

 LOAD DATA LOCAL INPATH '/root/classmem_Misli.txt' overwrite INTO TABLE classmem partition (teacher = 'Mis.li')  ;

 LOAD DATA LOCAL INPATH '/root/classmem_MrXu.txt' overwrite INTO TABLE classmem partition (teacher = 'Mis.Xu');  

 

4) 按分区进行数据查询 

  select * from classmem where teacher='Mis.Xu';   

 

五、桶的使用 

桶的原理是对一个表(或者分区)进行切片,选择被切片的字段,设定桶的个数,用字段与个数的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)

 

六、其他基本语句 

 1) 更改名称

alter table old_table_name RENAME TO new_table_name ;

 2)更改表名称

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type[COMMENT col_comment] 

 

 3)添加一个字段或者替换掉表中所有字段

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

     ADD是代表新增一字段,字段位置在所有列后面(partition列前);REPLACE则是表示替换表中所有字段

 

 

 七、在hive中查看hdfs文件

dfs -ls /user;

 

 

 八、时间处理函数 

  1) 字符串类型时间戳转换成日期

   select from_unixtime(cast('1326988805' as int),'yyyyMMddHH');  2012011908

  2)得到当前时间 

     select unix_timestamp()

  3)日期类型转换为时间戳  

select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss')

        select unix_timestamp(’2011-12-07 13:01:03′) 

   4)取日期的某一部分  hour,minute,second,weekofyear(当前是这个 年的第几周)

select to_date('2011-12-08 10:03:01′)  ;    --2011-12-08

select year('2011-12-08 10:03:01');--2011

select month('2011-12-08 10:03:01');

select day('2011-12-08 10:03:01'); 

select datediff(’2012-12-08′,’2012-05-09′)  查询时间差 

date_add(string startdate, int days)  日期添加天数 

date_sub (string startdate, int days)  日期减去天数 

 

 

 

 

 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hive 语法] 推荐:

Hive基本语法使用

- - 企业架构 - ITeye博客
1 创建表以及表的关联查询. 3 复杂数据类型的使用 . 一、 创建表以及表的关联查询. 2)创建本地数据文件 student.txt 和ticket.txt,并加载到hive的数据表中.  student.txt文件. ticket.txt文件,加载到数据库中每一行多的数据会被忽略掉,少得数据会变成null.

Hadoop Hive sql语法详解5--HiveQL与SQL区别

- - SQL - 编程语言 - ITeye博客
1.hive内联支持什么格式. 3.hive中empty是否为null. 4.hive是否支持插入现有表或则分区中. 5.hive是否支持INSERT INTO 表 values(). 1、Hive不支持等值连接 . •SQL中对两表内联可以写成:. •分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:.

Hive调优(语法与参数层面优化)

- - CSDN博客推荐文章
作为企业Hadoop应用的核心产品,Hive承载着FaceBook、淘宝等大佬 95%以上的离线统计,很多企业里的离线统计甚至全由Hive完成,如我所在的电商. Hive在企业云计算平台发挥的作用和影响愈来愈大,如何优化提速已经显得至关重要. 好的架构胜过任何优化,好的Hql同样会效率大增,修改Hive参数,有时也能起到很好的效果.

hive调优

- - 互联网 - ITeye博客
一、    控制hive任务中的map数: . 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);.

hive 优化 tips

- - CSDN博客推荐文章
一、     Hive join优化. 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key. 2.     注意带表分区的join, 如:.

Hive中的join

- - CSDN博客云计算推荐文章
select a.* from a join b on a.id = b.id select a.* from a join b on (a.id = b.id and a.department = b.department). 在使用join写查询的时候有一个原则:应该将条目少的表或者子查询放在join操作符的左边.

hive优化(2)

- - 开源软件 - ITeye博客
Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具. 使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别,. 所以需要去掉原有关系型数据库下开发的一些固有思维. 1:尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段.

hive优化

- - 开源软件 - ITeye博客
hive.optimize.cp=true:列裁剪. hive.optimize.prunner:分区裁剪. hive.limit.optimize.enable=true:优化LIMIT n语句. hive.limit.optimize.limit.file=10:最大文件数.   1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB).

Hive优化

- - 互联网 - ITeye博客
     使用Hive有一段时间了,目前发现需要进行优化的较多出现在出现join、distinct的情况下,而且一般都是reduce过程较慢.      Reduce过程比较慢的现象又可以分为两类:. 情形一:map已经达到100%,而reduce阶段一直是99%,属于数据倾斜. 情形二:使用了count(distinct)或者group by的操作,现象是reduce有进度但是进度缓慢,31%-32%-34%...一个附带的提示是使用reduce个数很可能是1.

hive bucket 桶

- - CSDN博客推荐文章
对于每一个表(table)或者分区,Hive可以进一步组织成桶. Hive也是针对某一列进行桶的组织. Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中. 采用桶能够带来一些好处,比如JOIN操作. 对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作. 那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量.