hive的一些基础知识

Hive 是什么? Hive 是建立在 Hadoop 上的数据仓库。通俗的说,数据仓库就是用来作为查询 分析的数据库,很少用来插入,修改,删除 当前我们使用的hive版本是2.5.3.0-37

hive中的基本数据类型

数值型:tinyint、smallint、int、integer、bigint、float、double、decimal

日期类型:timestamp(纳秒级时间戳) DATE(YYYY-MM-DD)

字符串类型 string varchar char

布尔类型 boolean(使用较少)

字节数组 binary

复杂数据类型 STRUCT、MAP、ARRAY

复杂数据类型的使用:

(1)STRUCT

CREATE TABLE student_test(id INT, info struct<name:STRING, age:INT>) 

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

COLLECTION ITEMS TERMINATED BY ':';

'FIELDS TERMINATED BY',':字段与字段之间的分隔符,''COLLECTION ITEMS TERMINATED BY' :一个字段各个item的分隔符

(2)ARRAY

建表

create table class_test(name string, student_id_list array<INT>)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

COLLECTION ITEMS TERMINATED BY ':';   

设置了一个int型数组,数组里的元素用:分隔

(3)MAP

create table employee(id string, perf map<string, int>)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t'//字段之间的分隔符

COLLECTION ITEMS TERMINATED BY ','//指定map里的每组元素之间的元素分隔符

MAP KEYS TERMINATED BY ':'; //指定map和key的分隔符


hive中的数据文件格式和压缩格式

文件格式

面向行/ 列类型 类型名称 是否可切割计算 优点 缺点 适用场景
面向行 文本文件格 式(.txt) 可以 查看、编辑简单 无压缩占空间 大、传输压力 大、数据解析 开销大 学习练习 使用
面向行 SequenceFil e 序列文件格 式(.seq 可以 自支持、二进制 kv 存储、支持行 和块压缩 本地查看不方 便:小文件合 并成 kv 结构 后不易查看内 部数据 生产环境 使用、map 输出的默 认文件格 式
面向列 rcfile 文件 格式(.rc) 可以 数据加载块、查 询快、空间利用 率高、高负载能 力 每一项都不是 最高 学习、生 产均可
面向列 orcfile 文件 格式(.orc) 可以 兼具 rcfile 优 点、进一步提高 了读取、存储效 率、新数据类型 的支持 每一项都不是 最高 学习、生 产均可

 

 

 

 

 

 

 

 

 

 

 

压缩格式

类型名称 可切分性 是否原生 支持 优点 缺点 适用场景
lzo(.lzo) 可切分 压缩/解压速度 快 合理的压缩率 压缩率比 gzip 低 不原生、 需要 native 安 装 单个文件越大, lzo 优点越越明 显。压缩完成 后>=200M 为宜
bzip2(.bz2 ) 可切分 高压缩率超过 gzip 原生支持、不 需要 native 安 装、用 linux bzip 可解压操 作 压缩/解压 速率慢 处理速度要求不 高、要求高压缩 率
gzip(.gz) 不可切分 压缩/解压速度 快原生/native 都支持使用方 便 不可切 分、对CPU 要求 较高 压缩完成后 <=130M 的文件适宜
snappy(.sn appy) 不可切分 高速压缩/解压 速度 合理的压缩率 压缩率比 gzip 低 不原生、 需要 native 安 装 适合作为 map- >reduce 或是 job 数据流的中 间数据传输格式
           

 

 

 

 

 

 

 

 

 

 

 

 

数据操作分类

DDL:建表删表修改表结构,创建删除视图,创建数据库,显示命令(Create/Drop/Alter Database, Create/Drop/Truncate Table, Alter Table/Partition/Column, Create/Drop/Alter View, Create/Drop Index, Create/Drop Function, Show Describe)

ddl中要注意内表和外表的区别,

内表:元数据和数据本身均被 hive 管理。删除表则全部删除。

外表:元数据被 hive 管理,数据本身存储在 hdfs,不受 hive 管理。 删除表则只删除元数据,数据本身不变,创建外表时在table前加 external

分区 伪列,并不是真正的字段,从hdfs上看,分区是一个文件路径。大部分分区字段都是日期

分桶  根据选定的字段的hash值来划定分桶,不是伪列,使用真实的字段

虚表:

row format:用于设定行、列、集合的分隔符等设置

CREATE TABLE student(
id string comment '学号',
username string comment '姓名',
classid int comment '班级 id',
classname string comment '班级名称'
)
comment '学生信息主表'
partitioned by (come_date string comment '按入学年份分区')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS textfile;

 

DML:数据插入(insert,load) load data ... into table,insert overwrite table

DQL:数据查询(select)  join

区分 inner join取两表交集;left join保留左表全部数据,右表没有与之对应的就置为NULL,right join与之相反;full outer join将两表数据全部保留。

hive不支持update和delete

hive的内置函数:聚合函数如sum、avg、max、min、count等。处于效率考虑,进行行数统计时使用count(1)而不是count(*)

                             字符串函数 reverse、trim 、split等split的用法split("a,b,c",","),其返回值是一个数组

                             表生成函数explode。常与later view连用形成新表

分析函数:NTILE:序列分析函数,用于数据分片排序,对数据分片并返回当前分片 值。(即对数据集分块,如第 1 块,第 2 块                    等),不均匀的时候,依次增 加前边分片序列的数量

                  ROW_NUMBER:序列分析函数,用于排序,按照顺序,不关心是否有相等 情况,从 1 开始逐条给数据一个加 1 后                    的序列号。如 1,2,3,4....

                  RANK:序列分析函数,用于排序,按照顺序,关心相等情况,如遇到相 等情况,名次会留下空位。1,2,2,4,4,6......

                  DENSE_RANK:DENSE_RANK:序列分析函数,用于排序,关心相等情况,如遇到相等情 况,名次不会留下位。                    如 1,2,2,3,3,4......

                  CUME_DIST:累计计算函数,计算公式为“小于等于当前值的行数/分组 内总行数",用于计算数据分布等场景。

                  PERCENT_RANK:累计计算函数,计算公式为” 分组内当前行的 RANK 值1/分组内总行数-1",用于计算处理进度等                      场景。

OVER() 从句和GROUP BY    over与聚合函数连用指定分析窗口函数的细化落围规则

hive的基本架构设计,如图 

Hive的自定义函数

1、udf (user define function) 实现的是输入输出1:1

创建自定义UDF的步骤:(1) 自定义java类(2)继承UDF类 (3)重写evaluate方法(4)maven打包 (5)add jar(6)使用create function创建临时函数(6)调用该udf函数

例如 实现输入的字符串两位后的全部都由*代替

package com.tianliangedu.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
/*
* 功能:实现当输入字符串超过 2 个字符的时候,多余的字符以"..."来表示。
* 输入/输出:* 如“12”则返回“12”,如“123”返回“12..."
*/
public class ValueMaskUDF extends UDF{
    public String evaluate(String input,int maxSaveStringLength,String replaceSign) {
        if(input.length()<=maxSaveStringLength){
            return input;
        }
         return input.substring(0,maxSaveStringLength)+replaceSign;
    }
    public static void main(String[] args) {
        System.out.println(new ValueMaskUDF().evaluate("河北省",2,"..."));;
    }
}

采取maven管理打包方式,相应的pom配置

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http:
//maven.apache.org/xsd/maven-4.0.0.xsd";>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianliangedu.course</groupId>
<artifactId>TlHadoopCore</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 首先配置仓库的服务器位置,首选阿里云,也可以配置镜像 -->
<repositories>
    <repository>
        <id>nexus-aliyun</id>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </repository>
</repositories>
<dependencies>
<!-- 引入 hadoop-cli-2.7.4 依赖 -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.7.4</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-cli</artifactId>
        <version>1.2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<build>
    <finalName>TlHadoopCore</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-assemblyplugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-withdependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>assembly</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-compilerplugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

maven打包后上传到目的路径里,命令是add jar jar包的路径,然后声明函数 create temporary function 函数名 as ‘包名.类名’;然后像使用系统函数一样,用select语句使用就行了。

2、udaf(user defined aggregation function)  作用相当于聚合函数

继承UDAF类

hive中的一些重要参数

名称设置类 mapred.job.name=JobName 任务在执行时的名称

资源限制类:mapred.reduce.tasks=reduceNum  设置reduce个数

                      mapred.map.task=mapNumber 设置map的个数

                      hive.exec.reducers.max 设置最大可用的reduce个数

性能优化类 hive.e

性能优化-本地化 hive.map.aggr

性能优化-数据倾斜类 hive.map.aggr 本地化的一个方法,

                                   hive.groupby.mapaggr.checkinterval 在map端开启聚合combiner,减少网络传输                                     减少数据倾斜的发生

hive参数的使用方式:1、配置文件设置。2、通过在进入hive cli时指定配置参数。3、进入hive cli后,通过set来设定也是session级参数,比较常见。4、通过shell脚本调用hive -e做参数设置和脚本执行,生产环境采用最多

数据架构 分为三层,源数据落地区(SDF),数据仓库区(DW),数据集市区(DM)

hive使用的引擎各自特点:1、配置mapreduce计算引擎set hive.execution.engine=mr;    2、配置spark计算引擎set hive.execution.engine=spark;3、配置tez 计算引擎set hive.execution.engine=tez;

MapReduce:是一种离线计算框架,将一个算法抽象成Map和Reduce两个阶段进行处理,非常适合数据密集型计算。

Spark:Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。

Tez: 是基于Hadoop Yarn之上的DAG(有向无环图,Directed Acyclic Graph)计算框架。它把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大的DAG任务,减少了Map/Reduce之间的文件存储。同时合理组合其子过程,也可以减少任务的运行时间
Tez可以将多个有依赖的作业转换为一个作业(这样只需写一次HDFS,且中间节点较少),从而大大提升DAG作业的性能

展开阅读全文

没有更多推荐了,返回首页