美文网首页hive
数据仓库Hive入门

数据仓库Hive入门

作者: 文景大大 | 来源:发表于2022-11-09 13:53 被阅读0次

    一、什么是数据仓库

    数据仓库(Data Warehouse,DW),是一种用于存储、分析和报告的数据系统,其目的是构建面向分析的集成化数据环境,其本身不产生数据,也不消费数据。

    • 面向主题,是高层次上数据综合归类的地方;
    • 集成性,是多个数据源统一综合的地方;
    • 非易变性,会保留相当长时间的历史数据,这些数据会提供大量的查询操作,但极少会修改和删除它们;
    • 时变性,数据会随着时间变化而更新,以满足变化的需求场景;

    二、什么是Hive

    Hive是建立在Hadoop之上的开源数据仓库系统,可以将存储在HDFS中的结构化、半结构化数据文件映射为一张数据库表,并基于表提供一种类SQL查询模型(HQL),用于用户访问和分析存储在HDFS中的大型数据集。其本质就是将HQL转换为MapReduce程序,然后提交给Hadoop集群执行。

    三、为什么要使用Hive

    不适用Hive也是可以的,但是会面临如下的问题:

    • 数据分析人员直接编写MapReduce成本较高,需要掌握Java语言;
    • 开发MapReduce来实现复杂查询逻辑比较困难;

    而使用Hive的好处则是:

    • 接口操作采用了HQL,一款类似SQL的查询语法,上手难度低,开发效率高;
    • 避免了直接编写MapReduce程序,减少了学习成本;
    • 支持自定义函数,扩展功能也很方便;
    • 依靠Hadoop,天然擅长存储和分析海量的数据集;

    所以Hive的最大优势就是可以让用户专注于编写HQL,而无需操心Hadoop底层的存储和计算过程,大大解放了用户的时间和脑力。

    四、Hive是如何工作的

    Hive主要包含如下几部分的组件:

    • 用户接口,其中CLI是命令行接口,Web Interface允许浏览器访问Hive,Thrift Server则是允许外部客户端通过JDBC/ODBC的协议和Hive进行交互;
    • 元数据存储,即描述数据的数据,主要是表的名字、表的列信息、表的属性、映射的文件信息等都存放再关系型数据库中,比如MySQL和Derby;
    • 驱动程序,主要包含解析器、编译器、优化器、执行器等,将HQL转换为可以在计算框架上执行的代码;
    • 执行引擎,也就是计算框架,比如支持的MR、Tez、Spark等;
    Hive架构示意图

    五、如何使用Hive

    在使用Hive之前,我们需要拥有一个健康运行的Hadoop集群,然后在其上安装MySQL和Hive,这部分内容网上有很多教程,此处不做赘述了。

    和关系型数据库一样,Hive拥有CLI命令行客户端,但是一般开发人员不会这么使用,都有更好的图形化工具使用,比如DataGrip、Dbeaver等,更加友好也能大大提升HQL编写的效率。

    5.1 DDL语句

    一、建表

    -- 创建数据库,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db
    create database if not exists zhangxun comment "zhangxun test database";
    -- 切换数据库
    use zhangxun;
    -- 创建数据表,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db/t_user_info
    create table t_user_info(
        id int comment "ID",
        name string comment "用户姓名",
        gender int comment "性别:0-男,1-女",
        age int comment "年龄"
    ) comment "用户信息表"
    -- 指定文件中字段之间的分隔符
    row format delimited fields terminated by ",";
    -- 导入数据操作(在hadoop集群的命令行里面操作上传)
    -- hadoop fs -put user-info.txt /user/hive/warehouse/zhangxun.db/t_user_info
    -- 查询数据
    select * from t_user_info;
    

    如下是自己准备的用户信息文件user-info.txt

    1,张三,0,22
    2,lisa,1,21
    3,jerry,0,28
    4,jack,0,32
    5,micky,1,29
    

    二、导数

    如上导入数据我们是使用的hdfs命令,Hive不推荐我们这么做,使用Hive的Load命令也可以实现数据的导入:

    -- 创建数据表,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db/t_car_info
    create table t_car_info(
        id int comment "ID",
        brand string comment "汽车品牌",
        year int comment "年份"
    ) comment "汽车信息表"
    row format delimited fields terminated by ",";
    -- 从HiveServer2所安装的服务器的路径上传到HDFS的/user/hive/warehouse/zhangxun.db/t_car_info下面
    load data local inpath '/root/data/car-info.txt' into table t_car_info;
    -- 查询数据
    select * from t_car_info;
    

    5.2 DML语句

    一、插入数据

    在上面我们提到Hive作为数据仓库具有“非易变性”,也就是说通常很少有场景会要去对已存的数据进行修改和插入,所以通常插入数据的场景多见于数据清洗和转换的需要。比如:

    • 原始表中的数据字段非常多,我们用于分析的数据并需要这么多无关的字段;
    • 原始表中存在脏数据,在分析前需要将这些脏数据进行过滤;
    • 原始表中存在非原子列或者不是理想的字段格式,需要在分析前将其拆分和转换;
    • 等等其它场景;

    我们使用:

    -- 先创建目标表
    create table t_target_user(id int,age int);
    -- 将原始表中的数据清洗后存入目标表(假设没有name值的用户信息是无效的)
    insert into table t_target_user select id,age from t_user_info where name is not null;
    

    或者更简单的:

    -- 无需提前创建目标表
    create table t_target_user as select id,age from t_user_info where name is not null;
    

    二、查询数据

    • select_expr,查询表达式,可以是字段、函数;
    • all/distinct,用于指定查询结果中重复的行如何处理;
    • where,过滤条件;
    • 聚合函数操作,比如count、sum、max、min、avg等函数,特点是不管原始数据有多少行,输出结果只有一条,就是聚合的结果;
    • group by,和聚合函数结合使用,根据一个或者多个列,对它们的内容进行分组聚合;
    • having,和group by结合使用,基于group by的结果进行过滤,并且支持使用聚合函数作为过滤条件;
    • order by,按照指定的列对结果集进行排序;
    • limit,限制查询返回的行数;

    三、关联数据

    • inner join,也就是join,两个表中都存在与连接条件相匹配的数据才会被留下来;
    • left outer join,也就是left join,以左表的全部数据为准,右表与之关联上的才会被保留下来;

    四、常用函数

    -- 查看所有可用的函数
    show functions;
    -- 查看某个具体函数的使用方法
    describe funciton extended funciton_name;
    
    • 数值类型函数
    • 日期类型函数
    • 字符串类型函数
    • 集合函数
    • 条件函数
    • 等等其它

    五、自定义函数

    • UDF,User Defined Function,普通函数,一个输入一个输出;
    • UDAF,User Defined Aggregation Function,聚合函数,多个输入一个输出;
    • UDTF,User Defined Table-Generating Function,表生成函数,一个输入多个输出;

    更多关于函数的内容可以参考LanguageManual UDF - Apache Hive - Apache Software Foundation

    总结下来,大体的使用方式和SQL语法一致,更多内容可以参考Home - Apache Hive - Apache Software Foundation

    相关文章

      网友评论

        本文标题:数据仓库Hive入门

        本文链接:https://www.haomeiwen.com/subject/vglntdtx.html