【大数据基础实践】(六)数据仓库Hive的基本操作

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 目录1. 数据仓库概念2. Hive简介2.1 简介2.2 特性2.3 生态系统3. Hive系统架构4. HQL转成MapReduce作业的原理4.1 join的实现原理4.2 group by的实现原理5. 实验练习5.1 环境配置5.1.1 HIVE5.1.2 MYSQL5.1.3 配置MySql为hive元数据存储数据库5.2 Shell进行实验内容5.2.1 新建一个数据库;5.2.2 新建表5.2.3 添加分区5.2.4 导入grade_zqc5.2.5 统计男、女生人数5.2.6 统计每个学生所有科目的总分以及平均分

目录

1. 数据仓库概念

2. Hive简介

2.1 简介

2.2 特性

2.3 生态系统

3. Hive系统架构

4. HQL转成MapReduce作业的原理

4.1 join的实现原理

4.2 group by的实现原理

5. 实验练习

5.1 环境配置

5.1.1 HIVE

5.1.2 MYSQL

5.1.3 配置MySql为hive元数据存储数据库

5.2 Shell进行实验内容

5.2.1 新建一个数据库;

5.2.2 新建表

5.2.3 添加分区

5.2.4 导入grade_zqc

5.2.5 统计男、女生人数

5.2.6 统计每个学生所有科目的总分以及平均分

5.2.7 统计每个科目有多少人以及每个科目平均成绩

5.2.8 查询chinese科目得分排前两名学生学号和分数;

5.2.9 创建一个新表rank_zqc保存CS系每个学生信息和科目总分,按成绩降序排序,并查询结果;

5.2.10 统计每个系所有科目平均成绩在所有系中的占比。

5.2.11 统计每个系每个科目考试不合格学生的占比。

5.2.12 删除分区,删除表,删除库,退出Hive。(删除操作请谨慎!)

5.3 JavaApi进行实验内容

最后

1. 数据仓库概念

数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。


image.png


数据仓库与传统数据库本质区别

数据仓库中的数据相对稳定,大部分情况下不会发变更,存储大量历史数据;

传统数据库一般只存储某一时刻状态信息,不保存历史数据。


2. Hive简介

2.1 简介

Hive是一个构建于Hadoop顶层的数据仓库工具

依赖分布式文件系统HDFS存储数据,依赖分布式并行计算模型MapReduce处理数据,本身不存储和处理数据(区别:传统数据仓库支持数据存储和处理分析)

支持大规模数据存储、分析,具有良好的可扩展性

定义了简单的类似SQL 的查询语言——HiveQL/HQL

用户可以通过编写的HQL语句运行MapReduce任务

可以很容易把原来构建在关系数据库上的数据仓库应用程序移植到Hadoop平台上

是一个可以提供有效、合理、直观组织和使用数据的分析工具

2.2 特性

采用批处理方式处理海量数据

Hive需要把HiveQL语句转换成MapReduce任务进行运行

数据仓库存储的是静态数据,对静态数据的分析适合采用批处理方式,不需要快速响应给出结果,而且数据本身也不会频繁变化

提供适合数据仓库操作的工具

Hive本身提供了一系列对数据进行提取、转换、加载(ETL)的工具,可以存储、查询和分析存储在Hadoop中的大规模数据

这些工具能够很好地满足数据仓库各种应用场景

2.3 生态系统

Hive依赖于HDFS 存储数据、

Hive依赖于MapReduce 处理数据

在某些场景下Pig可以作为Hive的替代工具

HBase 提供数据的实时访问

Pig主要用于数据仓库的ETL环节

Hive主要用于数据仓库海量数据的批处理分析

image.png


3. Hive系统架构

用户接口模块。包括CLI、HWI、JDBC、ODBC、Thrift Server

驱动模块(Driver)。包括编译器、优化器、执行器等,负责把HiveQL语句转换成一系列MapReduce作业

元数据存储模块(Metastore)。是一个独立的关系型数据库(自带derby数据库,或MySQL数据库)

image.png


4. HQL转成MapReduce作业的原理

4.1 join的实现原理

select name, orderid from user join order on user.uid=order.uid;

image.png


4.2 group by的实现原理

存在一个分组(Group By)操作,其功能是把表Score的不同片段按照rank和level的组合值进行合并,计算不同rank和level的组合值分别有几条记录:

select rank, level ,count(*) as value from score group by rank, level

image.png


5. 实验练习

5.1 环境配置

5.1.1 HIVE

image.png

将Hive解压到/usr/local中

image.png

更改名字

image.png

更改hive目录所有者和所在用户组

image.png

环境配置


image.png

使环境生效


image.png

5.1.2 MYSQL

更新软件源

image.png

image.png

安装mysql-server

image.png


安装成功

image.png

确定mysql服务是否打开

image.png

启动和关闭mysql服务


关闭

service mysql stop

启动

service mysql start

5.1.3 配置MySql为hive元数据存储数据库

进入mysql shell


sudo mysql 或 sudo mysql –u root –p 命令,回车后会提示输入密码,前者输入当前系统用户密码,后者是输入 mysql root 用户密码一般为空,回车进入 mysql 命令行。这里 root是 mysql 安装时默认创建的用户,不是 Ubuntu 系统的 root 用户。

image.png


新建一个数据库用来保存hive元数据(hive_metadata_zqc)


image.png


配置mysql允许hive接入

image.png

将所有数据库的所有表的所有权限赋给新建的hive_zqc用户,hive_zqc、'hive’是后续操作中要对 hive-site.xml 文件配置的连接到 MySQL 数据库的用户名、密码,由你自己定义;


刷新mysql系统权限关系表

image.png

exit 退出

image.png


配置hive


下载mysql jdbc包https://dev.mysql.com/downloads/connector/j/

image.png


image.png

image.png


解压jdbc包后,将其中的jar包拷贝至hive安装目录下lib文件夹中

image.png

进入/usr/local/hive/conf 目录。将hive-default.xml.template 重命名为hive-default.xml 保存着各个配置参数的默认值。

image.png

新建一个hive-site.xml 配置文件,并添加如下内容,该文件内容会覆盖原默认值

image.png

箭头标记处说明:hive_metadata_zqc 是前面步骤 MySQL 里新建的 database、hive_zqc和 hive 是连接数据库的用户名以及密码;

image.png

<configuration>
        <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/hive_metadata_zqc?createDatabaseIfNotExist=true</value>
        <description>JDBC connect string for a JDBC metastore</description>
        </property>
        <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for a JDBC metastore</description>
        </property>
        <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>hive_zqc</value>
        <description>username to use against metastore database</description>
        </property>
        <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>hive</value>
        <description>password to use against metastore database</description>
        </property>
</configuration>



初始化元数据库,启动 Hive,进入 Hive 运行时环境


初始化元数据库,不然有可能会报错。

image.png

可能出现错误

image.png

原因:com.google.common.base.Preconditions.checkArgument 这是因为 hive 内依赖的 guava.jar 和hadoop内的版本不一致造成的。


解决方法:查看hadoop安装目录下 share/hadoop/common/lib 内 guava.jar 版本,查看 hive安装目录下lib内guava.jar的版本,如果两者不一致,删除版本低的,并拷贝高版本的。

image.png

两个版本一样了

image.png

在进行一次初始化元数据库

image.png

成功了!

启动Hive


启动hive 之前,请先启动hadoop集群(start-dfs.sh)和确保MySQL服务正常运行。“hive”命令启动 hive。

启动hadoop集群

image.png


启动mysql

image.png

启动hive

image.png


5.2 Shell进行实验内容

表1 student_zqc:

image.png

表2 grade_zqc:

image.png

5.2.1 新建一个数据库;

新建一个数据库db_xxx,添加扩展参数:日期、学号、姓名;使用该数据库做后续操作;设置命令行显示当前使用的数据库,请保证后续操作都能显示。


创建的时候添加了日期,学号,姓名,以及存放路径

image.png

5.2.2 新建表

新建student_xxx分区表(分区字段Dept)和grade_xxx内部表,分别查看表结构和存储路径;(字段类型自定义)

image.png

image.png


5.2.3 添加分区

在表student_zqc中添加两个分区Dept=’CS’和Dept=’SE’,从本地导入数据到student_xxx表的两个分区中,分别查看两个分区所有记录,查看表数据存储目录;

image.png


从文件中加载数据,load data

语法 :

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename


首先在本地主目录下创建数据文件 input.txt,并上传到 HDFS 中。

注意分隔符要跟你表设置一致。


本地创建两个文件

input1.txt

image.png

input.txt

image.png

将两个文件上传到HDFS

image.png

在hive中加载

image.png

查看是否加载成功

image.png

5.2.4 导入grade_zqc

从HDFS导入数据到grade_xxx表中,查看grade_xxx表所有记录,查看表数据存储目录;


本地创建表 input3.txt

image.png

上传到hdfs

image.png

加载到hive中


image.png


5.2.5 统计男、女生人数

select sex,count(1) from student_zqc group by sex;

image.png


5.2.6 统计每个学生所有科目的总分以及平均分

image.png

select uid,avg(grade) from grade_zqc group by uid;

image.png


5.2.7 统计每个科目有多少人以及每个科目平均成绩

image.png



5.2.8 查询chinese科目得分排前两名学生学号和分数;

image.png


5.2.9 创建一个新表rank_zqc保存CS系每个学生信息和科目总分,按成绩降序排序,并查询结果;

image.png


image.png


image.png


image.png


image.png


image.png


5.2.10 统计每个系所有科目平均成绩在所有系中的占比。

例如CS系Chinese科目平均成绩在所有系的比例是1.06。


image.png


image.png


image.png


image.png

image.png


5.2.11 统计每个系每个科目考试不合格学生的占比。

image.png


5.2.12 删除分区,删除表,删除库,退出Hive。(删除操作请谨慎!)

查看表分区

image.png

删除分区

image.png

删除表

image.png

删除库

image.png

退出

image.png


5.3 JavaApi进行实验内容

编写一个UDF,函数名UDFXxx,查询学生(输入字段:student_xxx.Birth)出生天数。给出定义和使用UDF的完整流程和截图。


添加包

image.png

image.png


import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class UDFzqc extends UDF{
    public final static DateTimeFormatter DEFAULT_DATE_FORMATTER = DateTimeFormat.forPattern("yyyy/MM/dd");
    private Text result = new Text();
    public Text evaluate(Text birthday) throws ParseException{
        DateTime dateTime = null;
        try {
            dateTime = DateTime.parse(birthday.toString(), DEFAULT_DATE_FORMATTER);
        }catch(Exception e) {
            return null;
        }
        return evaluate(dateTime.toDate());
    }
    public Text evaluate(Date birthday) throws ParseException{
        DateTime dateTime = new DateTime(birthday);
        return evaluate(new IntWritable(dateTime.getYear()), new IntWritable(dateTime.getMonthOfYear()),
                new IntWritable(dateTime.getDayOfMonth()));
    }
    public Text evaluate(IntWritable year, IntWritable month,IntWritable day) throws ParseException{
        result.set(getDays(year.get(), month.get(), day.get()));
        return result;
    }
    private String getDays(int year, int month, int day) throws ParseException{
        String s = year + "/" + month + "/" + day;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Date d = sdf.parse(s);
        long birthTime = d.getTime();
        long nowTime = new Date().getTime();
        return (nowTime - birthTime)/1000/3600/24 + " days";
    }
    public static void main(String[] args) throws ParseException{
        UDFzqc test = new UDFzqc();
        System.out.println(test.evaluate(new Text("2021/06/01")));
    }
}
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
2月前
|
SQL 分布式计算 运维
如何对付一个耗时6h+的ODPS任务:慢节点优化实践
本文描述了大数据处理任务(特别是涉及大量JOIN操作的任务)中遇到的性能瓶颈问题及其优化过程。
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
58 4
|
17天前
|
边缘计算 人工智能 搜索推荐
大数据与零售业:精准营销的实践
【10月更文挑战第31天】在信息化社会,大数据技术正成为推动零售业革新的重要驱动力。本文探讨了大数据在零售业中的应用,包括客户细分、个性化推荐、动态定价、营销自动化、预测性分析、忠诚度管理和社交网络洞察等方面,通过实际案例展示了大数据如何帮助商家洞悉消费者行为,优化决策,实现精准营销。同时,文章也讨论了大数据面临的挑战和未来展望。
|
1月前
|
SQL 消息中间件 分布式计算
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
72 0
|
1月前
|
SQL 大数据
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
57 0
|
1月前
|
SQL 消息中间件 分布式计算
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
42 0
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
35 0
|
3月前
|
分布式计算 搜索推荐 物联网
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
|
3月前
|
人工智能 分布式计算 架构师
大数据及AI典型场景实践问题之基于MaxCompute构建Noxmobi全球化精准营销系统如何解决
大数据及AI典型场景实践问题之基于MaxCompute构建Noxmobi全球化精准营销系统如何解决
|
3月前
|
存储 SQL 分布式计算
MaxCompute 在大规模数据仓库中的应用
【8月更文第31天】随着大数据时代的到来,企业面临着海量数据的存储、处理和分析挑战。传统的数据仓库解决方案在面对PB级甚至EB级的数据规模时,往往显得力不从心。阿里云的 MaxCompute(原名 ODPS)是一个专为大规模数据处理设计的服务平台,它提供了强大的数据存储和计算能力,非常适合构建和管理大型数据仓库。本文将探讨 MaxCompute 在大规模数据仓库中的应用,并展示其相对于传统数据仓库的优势。
120 0