Hive基本使用教程
hive基础数据类型
hive是用java开发的,hive里的基本数据类型和java的基本数据类型也是一一对应的,除了string类型。有符号的整数类型:TINYINT、SMALLINT、INT和BIGINT分别等价于java的byte、short、int和long原子类型,它们分别为1字节、2字节、4字节和8字节有符号整数。Hive的浮点数据类型FLOAT和DOUBLE,对应于java的基本类型float和double类型。而hive的BOOLEAN类型相当于java的基本数据类型boolean。
hive复杂数据类型
包括ARRAY,MAP,STRUCT,UNION。这些复杂类型是由基础类型组成的。
ARRAY:ARRAY类型是由一系列同样数据类型元素组成的,这些元素能够通过下标来訪问。比方有一个ARRAY类型的变量fruits。它是由[‘apple’,’orange’,’mango’]组成,那么能够通过fruits[1]来訪问orange。
MAP:MAP包括key->value键值对。能够通过key来訪问元素。比方userlist是一个map类型(当中username是key。password是value),那么我们能够通过userlist[username]来得到这个用户相应的password.。
STRUCT:STRUCT能够包括不同数据类型的元素。这些元素能够通过点的方式来得到,比方user是一个STRUCT类型,那么能够通过user.address得到这个用户的地址。
Hive表类型
内部表
内部表也称之为MANAGED_TABLE;默认存储在/user/hive/warehouse下,也可以通过location指定;删除表时,会删除表数据以及元数据;
create table if not exists...
外部表
外部表称之为EXTERNAL_TABLE在创建表时可以自己指定目录位置(LOCATION);删除表时,只会删除元数据不会删除表数据;
create EXTERNAL table if not exists...
加载数据
(1) HDFS上导入数据到Hive表:
load data inpath '/home/wyp/add.txt' into table wyp;
(2) 从本地路径导入数据到Hive表
load data local inpath 'wyp.txt' into table wyp;
(3)从别的表查询加载到hive表
静态分区
insert into table test partition (age='25') select id, name, tel from wyp;
动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table test PARTITION (age) select id, name, tel, age from wyp;
insert into table和insert overwrite table的区别:后者会覆盖相应数据目录下的数据将。
创建相似表
create table table_name like other_table_name location "xxxxx"
查询数据输出到本地目录
INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='
select *from emp distribute by deptno sort by empno asc ;
cluster by = distribute by 和 sort by 值相同。
Hive UDF编程
udf实现
编程步骤:
1、继承org.apache.hadoop.hive.ql.UDF
2、需要实现evaluate函数; evaluate函数支持重载;
注意事项:
1、 UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
2、 UDF中常用Text/LongWritable等类型,不推荐使用java类型;
官网demo: https://cwiki.apache.org/confluence/display/Hive/HivePlugins
使用UDF非常简单,只需要继承org.apache.hadoop.hive.ql.exec.UDF,并定义public Object evaluate(Object args) {} 方法即可。
比如,下面的UDF函数实现了对一个String类型的字符串取HashMD5:
package 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;
public class HashMd5 extends UDF {
public String evaluate(String cookie) {
return MD5Hash.getMD5AsHex(Bytes.toBytes(cookie));
}
}
将上面的HashMd5类打成jar包,udf.jar
使用时候,在Hive命令行执行:
hive> add jar file:///tmp/udf.jar;
hive> CREATE temporary function str_md5 as 'com.lxw1234.hive.udf.HashMd5';
hive> select str_md5(‘lxw1234.com’) from dual;
transform
Hive中的TRANSFORM:使用脚本完成Map/Reduce。
hive> add file 'python文件路径'
hive> add file 'python文件路径'
hive> select
TRANSFORM(p.joint_attr_values, p.collect_product_id, p.released_id)
USING 'python split_product_attrs.py'
as (custom_attr , custom_attr_value, collect_product_id, released_product_id)
from
( 这里应该是另外一个select语句,用于Transform的输入,最好是一一对应的,否则会出错 )
下面是python的脚本,用于将三列转换为四列,这里就比较简单了,主要用于测试,代码随便写了一下
#!/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 line in sys.stdin:
values = line.split('\t')
values = [ i.strip() for i in values ]
tmp = values[0]
key_values = tmp.split(";")
for kv in key_values:
k = kv.split(":")[0]
v = kv.split(":")[1]
print '\t'.join([k,v,values[1],values[2]])
Hive企业优化方案
hive存储格式
1、TEXTFILE 默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。只有TEXTFILE表能直接加载数据,本地load数据,和external外部表直接加载运路径数据,都只能用TEXTFILE表。更深一步,hive默认支持的压缩文件(hadoop默认支持的压缩格式),也只能用TEXTFILE表直接读取。其他格式不行。可以通过TEXTFILE表加载后insert到其他表中。
2.orc 格式。 STORED AS ORC ;
3.parquet 格式。 STORED AS PARQUET ;
几种格式的差别 http://www.cnblogs.com/juncaoit/p/6067646.html
hive压缩优化
压缩配置:
map/reduce 输出压缩(一般采用序列化文件存储)
set 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;
中间压缩
中间压缩就是处理作业map任务和reduce任务之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式
<name>hive.exec.compress.intermediate</name>
<value>true</value>
</property>
hadoop压缩有一个默认的压缩格式,当然可以通过修改mapred.map.output.compression.codec属性,使用新的压缩格式,这个变量可以在mapred-site.xml 中设置或者在 hive-site.xml文件。 SnappyCodec 是一个较好的压缩格式,CPU消耗较低。
<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 大表 方案
Common/Shuffle/Reduce Join
普通mapreduce join ,相同key分配到同一个reducer。
Map Join
MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,适用于小表join 大表。
原来的sql可以通过使用hint的方式指定join时使用mapjoin
select /*+ mapjoin(t1)*/ t1.a,t1.b from table t1 join table2 t2 on ( t1.a=t2.a and f.ftime=20110802)
Map Join Java实现
http://www.cnblogs.com/ivanny/p/mapreduce_join.html
SMB Join (Sort Merge Bucket Join)
分区、桶、Sort Merge Bucket Join https://my.oschina.net/leejun2005/blog/178631
使用 SMB Join 需要如下配置
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
时间:2018-10-09 22:42 来源: 转发量:次
声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。
相关文章:
- [数据挖掘]基于Flink+Hive构建流批一体准实时数仓
- [数据挖掘]深度解读 Flink 1.11:流批一体 Hive 数仓
- [数据挖掘]四种高性能数据类型,Python collections助你优化代
- [数据挖掘]Hive和Spark究竟是凭借什么优势而大获成功?
- [数据挖掘]Hive和Spark究竟是凭借什么优势而大获成功?
- [数据挖掘]Hive和Spark究竟是凭借什么优势而大获成功
- [数据挖掘]大数据开发之路:hive篇,你看了吗?
- [数据挖掘]从 Hive 迁移到 SparkSQL,有赞的大数据实践
- [数据挖掘]基于Hadoop的数据仓库Hive 基础知识
- [数据挖掘]主流开源SQL引擎总结,不断改进的Hive始终遥遥领
相关推荐:
网友评论: