大数据初学者福利:Hive基本使用教程

蜂房数据类型

蜂房基础数据类型

蜂巢是用的Java开发的,蜂巢的里基本数据类型和Java的的基本数据类型也是一一对应的,除了字符串类型有符号的整数类型:TINYINT,SMALLINT,INT和BIGINT分别等价于Java的字节的,短型,整型和长原子类型,它们分别为1字节,2字节,4字节和8字节有符号整数.Hive的浮点数据类型FLOAT和DOUBLE,对应于的java的基本类型浮动和双类型。而蜂房的布尔类型相当于Java的的基本数据类型布尔值。

蜂巢复杂数据类型

包括阵列,MAP,结构,联合。这些复杂类型是由基础类型组成的。

ARRAY:。ARRAY类型是由一系列同样数据类型元素组成的,这些元素能够通过下标来访问比方有一个ARRAY类型的变量水果它是由[ '苹果', '橙', '芒果']组成,那么能够通过水果[1]来访问橙色。

MAP:。MAP包括键 - >值键值对能够通过键来访问元素比方用户列表是一个映射类型(用户名当中是key.password是值),那么我们能够通过用户列表[用户名]来得到这个用户相应的密码..

STRUCT:STRUCT能够包括不同数据类型的元素这些元素能够通过点的方式来得到,比方用户是一个STRUCT类型,那么能够通过user.address得到这个用户的地址。

蜂巢表类型

内部表

内部表也称之为MANAGED_TABLE;默认存储在/用户/蜂巢/仓库下,也可以通过位置指定;删除表时,会删除表数据以及元数据;

如果不存在则创建表...

外部表

外部表称之为EXTERNAL_TABLE在创建表时可以自己指定目录位置(LOCATION);删除表时,只会删除元数据不会删除表数据;

如果不存在,创建EXTERNAL表...

加载数据

(1)HDFS上导入数据到Hive表:

将路径'/home/wyp/add.txt'中的数据加载到表wyp中;

(2)从本地路径导入数据到Hive表

将数据本地路径'wyp.txt'加载到表wyp中;

(3)从别的表查询加载到蜂巢表

静态分区

插入表测试分区(age = '25')从wyp中选择id,name,tel;

动态分区

set hive.exec.dynamic.partition = true; 
set hive.exec.dynamic.partition.mode = nonstrict; 
insert overwrite table test PARTITION(age)从wyp中选择id,name,tel,age;

插入表和插入覆盖表的区别:后者会覆盖相应数据目录下的数据将。

创建相似表

create table table_name like other_table_name location“xxxxx”

查询数据输出到本地目录

INSERT OVERWRITE DIRECTORY'/ tmp / hdfs_out'SELECT a。* FROM邀请WHERE a.ds ='“;

select by from emp deptno by empno asc;

cluster by =由和相分配。

Hive UDF编程

UDF实现

编程步骤:

1,继承org.apache.hadoop.hive.ql.UDF

2,需要实现评估函数; 评价函数支持重载;

注意事项:

1,UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

2,UDF中常用Text / LongWritable等类型,不推荐使用java类型;

官网演示:https://cwiki.apache.org/confluence/display/Hive/HivePlugins

使用UDF非常简单,只需要继承org.apache.hadoop.hive.ql.exec.UDF,并定义public Object evaluate(Object args){}方法即可。

比如,下面的UDF函数实现了对一个字符串类型的字符串取HashMD5:

包com.lxw1234.hive.udf;

import org.apache.hadoop.hbase.util.Bytes; 
import org.apache.hadoop.hbase.util.MD5Hash; 
import org.apache.hadoop.hive.ql.exec.UDF;

公共类HashMd5扩展UDF { 
public String evaluate(String cookie){ 
return MD5Hash.getMD5AsHex(Bytes.toBytes(cookie)); 

}

将上面的HashMd5类打成JAR包,udf.jar

使用时候,在蜂巢命令行执行:

hive> add jar file:///tmp/udf.jar ; 
hive>将临时函数str_md5创建为'com.lxw1234.hive.udf.HashMd5'; 
hive>从dual中选择str_md5('lxw1234.com');

转变

蜂房中的变换:使用脚本完成的Map / Reduce。

hive>添加文件'python文件路径'

hive>添加文件'python文件路径' 
hive>选择
TRANSFORM(p.joint_attr_values,p.collect_product_id,p.released_id)
使用'python split_product_attrs.py' 
作为(custom_attr,custom_attr_value ,collect_product_id,released_product_id)
来自
(这里应该是另外一个select语句,用于Transform的输入,最好是一一对应的,否则会出错)

下面是蟒的脚本,用于将三列转换为四列,这里就比较简单了,主要用于测试,代码随便写了一下

#!/ usr / bin / python 
## _ * _ coding:utf-8 _ * _ 

import sys 
import datetime 
#“规格:RN1-10 / 50;规格:RN1-10 / 50;规格:RN1-10 / 50 “ 
#[”规格:RN1-10 / 51;规格:RN1-10 / 52;规格:RN1-10 / 53“,”11“,”22“] 
#[”规格“,”RN1-10 / 51“ ,
'11 ','22'] #[“规格”,“RN1-10 / 52”,'11','22'] 
#[“规格”,“RN1-10 / 53”,'11',' 22'] 

for sys.stdin中的行:
values = line.split('\ t')
values = [i中的i的i.strip()] 
tmp = values [0] 
key_values = tmp.split(“;”)
对于key_values中的kv:
k = kv.split(“:”)[0] 
v = kv.split(“:”)[1] 
print'\ t'。join([k,v,values [1],values [2]])

蜂巢企业优化方案

蜂巢存储格式

1,TEXTFILE默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。只有TEXTFILE表能直接加载数据,本地载数据,和外部外部表直接加载运路径数据,都只能用TEXTFILE表。更深一步,蜂房默认支持的压缩文件(hadoop的默认支持的压缩格式),也只能用TEXTFILE表直接读取。其他格式不行。可以通过TEXTFILE表加载后插入到其他表中。

2. orc格式。作为ORC存储;

3.parquet格式。存储为PARQUET;

几种格式的差别http://www.cnblogs.com/juncaoit/p/6067646.html

蜂巢压缩优化

压缩配置:

map / reduce输出压缩(一般采用序列化文件存储)

设置hive.exec.compress.output = true; 
set mapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec; 
set mapred.output.compression.type = BLOCK;

任务中间压缩

set hive.exec.compress.intermediate = true; 
set hive.intermediate.compression.codec = org.apache.hadoop.io.compress.SnappyCodec;(常用)
set hive.intermediate.compression.type = BLOCK;

中间压缩

中间压缩就是处理作业映射任务和减少任务之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式

 

<property> 
<name> hive.exec.compress.intermediate </ name> 
<value> true </ value> 
</ property>

 

 

hadoop压缩有一个默认的压缩格式,当然可以通过修改mapred.map.output.compression.codec属性,使用新的压缩格式,这个变量可以在mapred-site.xml中设置或者在hive-site.xml文件。 SnappyCodec是一个较好的压缩格式,CPU消耗较低。

 

<property> 
<name> mapred.map.output.compression.codec </ name> 
<value> org.apache.hadoop.io.compress.SnappyCodec </ value> 
</ property>

 

hive压缩文档https://yq.aliyun.com/articles/60859

 

 

MapReduce的中使用压缩

 

 

Hive中使用压缩

 

 

Hive数据倾斜解决方案

小表join大表大表join大表方案

普通/随机/减少加入

普通mapreduce join,相同键分配到同一个reducer。

地图加入

MAPJION会把小表全部读入内存中,在地图阶段直接拿另外一个表的数据和内存中表数据做匹配,适用于小表加入大表。

原来的SQL可以通过使用提示的方式指定加入时使用mapjoin

选择/ * + mapjoin(t1)* / t1.a,t1.b从表t1加入table2 t2 on(t1.a = t2.a和f.ftime = 20110802)

Map加入Java实现

http://www.cnblogs.com/ivanny/p/mapreduce_join.html

SMB加入(排序合并桶加入)

分区,桶,排序合并桶加入https://my.oschina.net/leejun2005/blog/178631

使用SMB加入需要如下配置

set hive.auto.convert.sortmerge.join = true; 
set hive.optimize.bucketmapjoin = true; 
set hive.optimize.bucketmapjoin.sortedmerge = true;

结语

为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,帮助大家在成为大数据工程师,乃至架构师的路上披荆斩棘。在这里给大家推荐一个大数据学习交流圈:

658558542   

欢迎大家进群交流讨论,学习交流,共同进步。

当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。

但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有有效资源还是很有必要的。

最后祝福所有遇到瓶疾且不知道怎么办的大数据程序员们,祝福大家在往后的工作与面试中一切顺利。

猜你喜欢

转载自blog.csdn.net/weixin_44233163/article/details/86231109