(四)Hive1.2.2

1. order by,sort by,distribute by,cluster by的区别?

2. 聚合函数是否可以写在order by后面,为什么?

需求催生技术进步

================================================================================

一、课前准备

二、课堂主题

三、课堂目标

1. 掌握hive表的数据压缩和文件存储格式

2. 掌握hive的JDBC代码操作

3. 掌握的自定义UDF函数

4. 掌握hive的SerDe

5. 掌握hive的优化

四、知识要点

1. hive表的数据压缩

1.1 数据的压缩说明

压缩模式评价

可使用以下三种标准对压缩方式进行评价

  1. 压缩比:压缩比越高,压缩后文件越小,所以压缩比越高越好

  2. 压缩时间:越快越好

  3. 已经压缩的格式文件是否可以再分割:可以分割的格式允许单一文件由多个Mapper

  程序处理,可以更好的并行化

常见压缩格式

压缩方式压缩比压缩速度解压缩速度是否可分割
gzip 13.4% 21 MB/s 118 MB/s
bzip2 13.2% 2.4MB/s 9.5MB/s
lzo 20.5% 135 MB/s 410 MB/s
snappy 22.2% 172 MB/s 409 MB/s

hadoop编码/解码器方式

压缩格式对应的编码/解码器
DEFLATE org.apache.hadoop.io.compress.DefaultCodec
Gzip org.apache.hadoop.io.compress.GzipCodec
BZip2 org.apache.hadoop.io.compress.BZip2Codec
LZO com.hadoop.compress.lzo.LzopCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec

1.2 数据压缩使用

  • hive表中间数据压缩

#设置为true为激活中间数据压缩功能,默认是false,没有开启
set hive.exec.compress.intermediate=true;
#设置中间数据的压缩算法
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;

  • hive表最终输出结果压缩

set hive.exec.compress.output=true;
set mapred.output.compression.codec=
org.apache.hadoop.io.compress.SnappyCodec;

2 hive表的文件存储格式

2.1 文件存储格式说明

  • Hive支持的存储数的格式主要有:textFilesequencefileorcparquet
  • 其中textFile为默认格式,建表时默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。sequencefileorcparquet格式的表不能直接从本地文件导入数据,数据要先导入到TextFile格式的表中,然后再从textFile表中用insert导入到sequencefile、orc、parquet表中。
  • textFile sequencefile的存储格式都是基于行存储的;
  • orcparquet 是基于列式存储的。

2.2 文件存储格式使用对比

3 hive的函数

3.1 系统内置函数

1、查看系统自带函数

  show functions;

2、显示自带的函数的用法

  desc function 函数名;

3.2 自定义函数

  • Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展
  • 当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)

根据用户自定义函数类别分为以下三种:

1、UDF(user -defined-function)

  一进一出(这个词怪怪的,很邪恶)

2、UDAF(user-defined-aggregation-function)

  聚合函数,多进一出

3、UDTF(user-defined table-generating functions)

  一进多出

3.3 自定义UDF函数编程步骤

1、定义一个类继承==org.apache.hadoop.hive.ql.UDF==

2、需要实现==evaluate==函数;evaluate函数支持重载;

3、将程序打成jar包上传到linux服务器

4、在hive的命令行窗口创建函数

  a) 添加 jar包

  ==add jar xxxxx.jar== (linux上jar包的路径)

  b) 创建function

  create [temporary] function [dbname.]function_name AS class_name;

5、hive命令行中删除函数

  Drop [temporary] function [if exists] [dbname.]function_name;

6、注意事项

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

3.4 自定义UDF函数案例实战

此处省略三千字

4.  hive客户端jdbc操作

4.1 引人依赖

4.2 代码开发

此处省略三千字

5. hive的SerDe

5.1 hive的SerDe是什么

Serde是 ==Serializer/Deserializer==的简写。hive使用Serde进行行对象的序列与反序列化。最后实现把文件内容映射到 hive 表中的字段数据类型。

为了更好的阐述使用 SerDe 的场景,我们需要了解一下 Hive 是如何读数据的(类似于 HDFS 中数据的读写操作):

HDFS files –> InputFileFormat –> <key, value> –> Deserializer –> Row object

Row object –> Serializer –> <key, value> –> OutputFileFormat –> HDFS files

5.2 hive的SerDe类型

Hive 中内置==org.apache.hadoop.hive.serde2== 库,内部封装了很多不同的SerDe类型。

hive创建表时, 通过自定义的SerDe或使用Hive内置的SerDe类型指定数据的序列化和反序列化方式。

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]

  • 如上创建表语句, 使用==row format 参数说明SerDe的类型。==
  • 你可以创建表时使用用户自定义的Serde或者native Serde如果 ROW FORMAT没有指定或者指定了 ROW FORMAT DELIMITED就会使用native Serde

这一部分没什么

===========一些练习题

省略,下一阶

原文地址:https://www.cnblogs.com/hanchaoyue/p/13195535.html