hive知识3

文件格式

TextFile
SequenceFile
RCFile
ORC



使用 SequenceFile存储格式 存储

> create table test2(str STRING) STORED AS SEQUENCEFILE; 
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compress=true;
hive> set mapred.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
hive> set io.seqfile.compression.type=BLOCK;
hive> set io.compression.codecs=com.hadoop.compression.lzo.LzoCodec;
hive> INSERT OVERWRITE TABLE test2 SELECT * FROM test1;

SequenceFile以二进制方式存储,例如010100100101001



使用 RCFile 存储
RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

hive知识3_第1张图片
hive> create table test3(str STRING)  STORED AS RCFILE; 
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compress=true;
hive> set mapred.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
hive> set io.compression.codecs=com.hadoop.compression.lzo.LzoCodec;
hive> INSERT OVERWRITE TABLE test3 SELECT * FROM test1; 


使用 ORC 存储
是对rc存储的优化
它的存储带有索引,基于块压缩,输出到单个文件上
hive> create table t1_orc(id int, name string) row format delimited fields terminated by '\t' stored as orc tblproperties("orc.compress"="ZLIB");
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
hive> SET hive.default.fileformat=Orc;
hive> insert overwrite table t1_orc select * from t1;

Hive SerDe

What is a SerDe?
ØSerDe 是 "Serializer and Deserializer."的缩写
ØHive 使用 SerDe和FileFormat进行行内容的读写.
ØHDFS文件 --> InputFileFormat --> --> Deserializer --> 行对象
Ø行对象 --> Serializer --> --> OutputFileFormat --> HDFS文件
注意: 数据全部存在在value中,key内容无意义。


Hive 使用如下FileFormat 类读写 HDFS files:
ØTextInputFormat/HiveIgnoreKeyTextOutputFormat: 读写普通HDFS文本文件.
ØSequenceFileInputFormat/SequenceFileOutputFormat: 读写SequenceFile格式的HDFS文件.
Hive 使用如下SerDe 类(反)序列化数据:
ØMetadataTypedColumnsetSerDe: 读写csv、tsv文件和默认格式文件
ØThriftSerDe: 读写Thrift 序列化后的对象.
ØDynamicSerDe: 读写Thrift序列化后的对象, 不过不需要解读schema中的ddl.



使用 CSV Serde

  CSV格式的文件也称为逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号。在本文中的CSV格式的数据就不是简单的逗号分割的),其文件以纯文本形式存储表格数据(数字和文本)。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
默认的分隔符是
DEFAULT_ESCAPE_CHARACTER \
DEFAULT_QUOTE_CHARACTER  "     --- 如果没有,则不需要指定
DEFAULT_SEPARATOR        ,
CREATE TABLE csv_table(a string, b string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES (   "separatorChar" = "\t",   "quoteChar"     = "'",   "escapeChar"    = "\\")  STORED AS TEXTFILE;
separatorChar:分隔符
quoteChar:引号符
escapeChar:转意符

总结
textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
sequencefile 存储空间消耗大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低


Lateral View 语法

lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。
创建表
create table t8(name string,nums array)row format delimited fields terminated by "\t" COLLECTION ITEMS TERMINATED BY ':';
数据切割
SELECT name,new_num FROM t8 LATERAL VIEW explode(nums) num AS new_num;

hive高级函数
简单查询
select ... from...where...
使用各种函数
hive>show functions;  查看所有函数
hive>describe function explode;   查看函数explode的描述
LIMIT语句
列别名
嵌套select语句

标准函数
reverse()
upper()
聚合函数
avg()
sum()
自定义函数
UDF


select name ,age ,case when age<24 then 'low' when age>=24 and age<27 then 'middle' when age>27 and age<30 then 'high' else 'very high' end as score from t3;
查询结果
name     age      score
ww           10      low
kk             25      middle
ss             28       high


数据类型转换
select name,age from t3 where cast(age AS FLOAT) <25.0


hive 性能调优
什么时候可以避免执行MapReduce?
select *  or  select field1,field2 
limite 10
where语句中只有分区字段
使用本地set hive.exec.mode.local.auto=true;
group by语句:
通常和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每组执行聚合操作
having语句:
限制结果的输出


hive将查询转化为MapReduce执行,hive的优化可以转化为mapreduce的优化!
hive是如何将查询转化为MapReduce的?
EXPLAIN的使用
hive对sql的查询计划信息解析
EXPLAIN SELECT COUNT(1) FROM T1;
EXPLAIN EXTENDED
显示详细扩展查询计划信息

性能调优 本地 mr

本地模式设置方式:
set mapred.job.tracker=local;
set hive.exec.mode.local.auto=true;
测试 select 1 from wlan limit 5;
下面两个参数是local mr中常用的控制参数:
1,hive.exec.mode.local.auto.inputbytes.max默认134217728(128M)
设置local mr的最大输入数据量,当输入数据量小于这个值的时候会采用local  mr的方式
2,hive.exec.mode.local.auto.input.files.max默认是4
设置local mr的最大输入文件个数,当输入文件个数小于这个值的时候会采用local mr的方式


开启并行计算,增加集群的利用率
set hive.exec.parallel=true
设置严格模式
set hive.mapred.mode=strict | nostrict;
strict可以禁止三种类型的查询:
一、强制分区表的where条件过滤
二、Order by语句必须使用limit
三、限制笛卡尔积查询

调整mapper和reducer的数量
太多map导致启动产生过多开销

map任务数是由Splits个数决定的
mapred.min.split.size


按照输入数据量大小确定reducer数目,
set mapred.reduce.tasks=  默认3
dfs -count  /分区目录/*
hive.exec.reducers.max设置阻止资源过度消耗


JVM重用

一个jvm完成一个task任务就会关闭,如果task任务多,就会导致频繁的开启jvm

小文件多或task多的业务场景
set mapred.job.reuse.jvm.num.task=10
会一直占用task槽

order by 语句: 是全局排序
sort by 语句: 是单reduce排序
distribute by语句: 是分区字段排序;
cluster by语句:
可以确保类似的数据的分发到同一个reduce task中,并且保证数据有序防止所有的数据分发到同一个reduce上,导致整体的job时间延长
cluster by语句的等价语句:
distribute by Word sort by Word ASC



性能调优 Map-side 聚合(数据倾斜的时候可以采用)

set hive.map.aggr=true;
这个设置可以将顶层的聚合操作放在Map阶段执行,从而减轻清洗阶段数据传输和Reduce阶段的执行时间,提升总体性能。
缺点:该设置会消耗更多的内存。
执行select count(1) from wlan;

hive的性能设置参数都可以在用户目录下的.hiverc中配置

性能调优 -jion 优化
驱动表最右边
查询表表的大小从左边到右边依次增大
标志机制
显示的告知查询优化器哪张表示大表
/*+streamtable(table_name)*/

表连接 ( 只支持等值连接 )
INNER JOIN
两张表中都有,且两表符合连接条件
select t1.name,t1.age,t9.age from t9 join t1 on t1.name=t9.name;
LEFT OUTER JOIN
左表中符合where条件出现,右表可以为空
RIGHT OUTER JOIN
右表中符合where条件出现,左表可以为空
FULL OUTER JOIN
返回所有表符合where条件的所有记录,没有NULL替代
LEFT SEMI-JOIN
左表中符合右表on条件出现,右表不出现
select t1.name,t1.age from t9 LEFT SEMI JOIN t1 on t1.name=t9.name;
笛卡尔积
是m x n的结果
map-side JOIN
只有一张小表,在mapper的时候将小表完全放在内存中
select /*+ mapjoin(t9) */t1.name,t1.age from t9 JOIN t1on t1.name=t9.name;


hive UDF 操作

1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。
2、编写UDF函数的时候需要注意一下几点:
a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。
b)需要实现evaluate函数,evaluate函数支持重载。
4、步骤
a)把程序打包放到目标机器上去;
b)进入hive客户端,添加jar包:hive>add jar /run/jar/udf_test.jar;
c)创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';

d)查询HQL语句:
SELECT add_example(8, 9) FROM scores;
SELECT add_example(scores.math, scores.art) FROM scores;
SELECT add_example(6, 7, 8, 6.8) FROM scores;
e)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;

要想自定义函数每次启动都能用,可以在hiverc文件中增加命令
add jar /run/jar/udf_test.jar
CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';

或者将这些命令在脚本文件中存储在Hive_Home/scripts目录下,启动时会按文件顺序加载


注:UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF
写java代码连接hive时,服务端需要打开hive服务 hive --service hiveserver2   服务会占用10000端口
 netstat -pan |grep 10000

你可能感兴趣的:(hive)