Hive仓库基本操作

1.hive中可以执行shell命令

用户可以直接在hive中执行shell命令,只需要使用!开始,使用(;)结尾

!/bin/echo"what up dog" ;

! pwd

使用--开头表示注释

--This is a comment!

2.显示字段名称

hive默认是不显示字段名称的,可以使用hive.cli.print.header为true进行配置

3.执行dfs命令

用户可以在cli中执行hadoop命令,只需要将hadoop的去掉即可,用分号(;)结尾

dfs  -ls /;

4.数据类型和文件格式数据类型

所有的数据类型都是Java接口的实现,所有所有的具体行为细节和实现与对应的java是一致的。

BINARY和关系型数据库VARBINARY数据类型相似,但是和BLOB数据类型不同,因为BINARY的列是存储在记录中的,而BLOB不是,BLOB是一个可以存储二进制文件的容器。

集合的数据类型,STRUCT{FIELD1 string,FIELD2}那么第一个字段可以通过元素来引用。

集合类型主要包括:array,map,struct等,hive的特性支持集合类型,这特性是关系型数据库所不支持的,利用好集合类型可以有效提升SQL的查询速率。

create table t_person(

id int,

name string,

likes array  )

row format delimited

fields terminated by ','

collection items terminated by '_';

load data local inpath 'Documents/hive/t_person.txt' into tablet_person;

导入数据格式

  1,王力宏,唱歌_钢琴_二胡_作曲_演戏_导演_书法

create table t_person(

id int,

name string,

tedia map  )

row format delimited

fields terminated by ','

collection items terminated by '_'

map keys terminated by ':';

1,王力宏,性别:男_形象:非常健康

create table t_person(

id int,

name string,

address struct  )

row format delimited

fields terminated by ','

collection items terminated by '_';

1,王力宏,台湾省_台北市

HiveQL数据操作

hive不支持行级插入操作、更新和删除,也不支持事务,除此外,和基本数据库一致。

在创建表的最后可以指定HDFS的存储路径,使用通常的创建创建的都是管理表,也叫内部表

创建外部表,createexternal table来创建外部表,在删除内部表,会把元数据和数据全部删除,但是创建外部表删除只会删除元数据。

分区表

Hive中的查询一般会扫描到整个表,有时只需要扫描部分数据引入了分区表。

通常使用分区来分散水平压力,将数据从物理上转移到距使用最频繁的用户更近的地方,分区还可以将数据进行分层存储。

使用partitioned关键字进行分区,创建一个分区,就会在HDFS中创建一个相应的文件夹。

同时也可以创建外部分区表,同时hive可以自定义表的存储格式,例如存储为文本格式,storedas  textfile

桶表

hive采用的是Hash值,然后除以桶的个数求余的方式决定该条记录应该存储于哪一个桶中

HiveQL数据操作

从HDFS上导入数据到Hive

hadoop fs -put /home/zkpk/empmessages    /data/emp_messages

使用overwrite关键字可以覆盖原理的表

insert overwrite table emp_meaages select * from old_emp_meaages

其他查询语句和平常的mysql查询语句是一致的。

union all

hive不支持union操作,只支持unionall语句

select c.uid,c.keyword  from  (select a.uid,a.key from table1) unionall  (select a.uid,a.key from table2)

hive的join只支持等值连接

抽样查询

随机抽样

使用RAND()函数和LIMIT关键字来获取样例数据,使用DISTRIBUTE和SORT关键字来保证数据是随机分散到mapper和reducer的。ORDERBY RAND()语句可以获得同样的效果,但是性能没这么高。

1. Random sampling

使用RAND()函数和LIMIT关键字来获取样例数据。使用DISTRIBUTE和SORT关键字来保证数据是随机分散到mapper和reducer的。ORDERBY RAND()语句可以获得同样的效果,但是性能没这么高。

SELECT * FROM DISTRIBUTE BY RAND() SORT BYRAND()  LIMIT ;

2. Bucket table sampling

该方式是最佳化采样bucket表。RAND()函数也可以用来采样整行。如果采样列同时使用了CLUSTEREDBY,使用TABLESAMPLE语句会更有效率。

SELECT * FROM   TABLESAMPLE(BUCKET OUT OF ON [colname|RAND()]) table_alias;

1)使用下面的语句,从表lxw111中取样50%的数据,创建一个新表:

CREATE TABLE lxw1234 AS

SELECT * FROM lxw1 TABLESAMPLE (50 PERCENT);

2)这种方式指定取样数据的大小,单位为M。比如,下面的语句:

SELECT * FROM lxw1 TABLESAMPLE (30M);

3)这种方式可以根据行数来取样,但要特别注意:这里指定的行数,是在每个InputSplit中取样的行数,也就是,每个Map中都取样nROWS。

SELECT * FROM lxw1 TABLESAMPLE (200 ROWS)

4) table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])

如果基于一个已经分桶表进行取样,将会更有效率。

执行下面的语句,创建一个分桶表,并插入数据:

CREATE TABLE lxw1_bucketed (pcid STRING)

CLUSTERED BY(pcid) INTO 10 BUCKETS;

INSERT overwrite TABLE lxw1_bucketed

SELECT pcid FROM lxw1;

表lxw1_bucketed按照pcid字段分成10个桶,下面的语句表示从10个桶中抽样第一个桶的数据:

SELECT COUNT(1) FROM lxw1_bucketed TABLESAMPLE(BUCKET 1 OUT OF 10 ONpcid);

HiveQL视图与索引

hive中的视图与索引和mysql中的基本一致

Hive中的函数

Create Temporary Function

CREATE TEMPORARY FUNCTION function_name AS class_name;

将包添加到当前环境

hive>add jar /opt/lib/hive-train-1.0.jar;

创建一个临时函数


hive>CREATE TEMPORARY FUNCTION sayHello AS'com.zhaotao.bigdata.hive.HelloUDF'

hive>show functions;

hive>desc function sayHello;

hive>select ename,sayHello(ename) from emp;

使用java继承UDF编写自定义函数

import java.text.SimpleDateFormat;

import java.util.Date;

import org.apache.hadoop.hive.ql.exec.UDF;

import org.junit.Test;

public class UDFZodiacSign extends UDF {

private  SimpleDateFormat df ;

public UDFZodiacSign() {

df = new SimpleDateFormat("MM-dd-yyyy");

}

public  String evaluate(Date bday){

return evaluate(bday.getMonth(),bday.getDay());

}

public  String evaluate(String bday){

Date date =null;

try{

date = df.parse(bday);

}

catch(Exception ex){

System.out.println("异常");

ex.printStackTrace();

return null;

}

return evaluate(date.getMonth()+1,date.getDay());

}

public  String evaluate(Integer month,Integer day){

if(month ==1){

if(day<20){

return "Capricorn";

}else{

return "Aquarius";

}

}

if(month ==2){

if(day<19){

return "Capricorn";

}else{

return "Pisces";

}

}

if(month ==3){

if(day<20){

return "Pisces";

}else{

return "Aries";

}

}

if(month ==4){

if(day<20){

return "Aries";

}else{

return "Taurus";

}

}

if(month ==5){

if(day<20){

return "Taurus";

}else{

return "Gemini";

}

}

if(month ==6){

if(day<21){

return "Gemini";

}else{

return "Cancer";

}

}

if(month ==7){

if(day<22){

return "Cancer";

}else{

return "Leo";

}

}

if(month ==8){

if(day<23){

return "Leo";

}else{

return "Virgo";

}

}

if(month ==9){

if(day<22){

return "Virgo";

}else{

return "Libra";

}

}

if(month ==10){

if(day<24){

return "Libra";

}else{

return "Scorpio";

}

}

if(month ==11){

if(day<22){

return "Scorpio";

}else{

return "Sagittarius";

}

}

if(month ==12){

if(day<22){

return "Sagittarius";

}else{

return "Capricorn";

}

}

return null;

}

@Test

public void test() {

UDFZodiacSign aa = new UDFZodiacSign();

String str = aa.evaluate("01-10-2004");

System.out.println(str);

}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容