• 如何构建Hive数据仓库Hive 、数据仓库的存储方式 以及hive数据的导入导出


    什么是Hive

    hive是基于Hadoop的一个数据仓库工具,可以将结构化数据映射为一张表。
    hive支持使用sql语法对存储的表进行查询
    (本质上是把sql转成mapreduce的任务执行)

    Hive有三个特点:

    • hive所存储的数据是放在HDFS文件系统中的
    • hive的底层实现是mapreduce
    • 这些任务是运行在Yarn上的

    如何构建Hive数据仓库

    什么是数据仓库

    官方定义:数据仓库是面向主题的、集成的、不可更新的、随时间的变化而不断变化的,这些特点决定了数据仓库的系统设计不能采用同开发传统的OLTP数据库一样的设计方法。

    (1)安装hive
    常规配置,这里不记录安装过程

    唯一需要注意的地方是有一个hive.metastroe.dirname属性需要配置
    配置的值是hive元数据的存储路径,一般为hdfs文件系统的路径。

    安装完成后,需要在mysql中建立配置中指定的数据库并初始化Hive源数据库

    (2)安装完成之后就可以启动hive

    Hive数据仓库的储存方式

    Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中 。

    Hive主要有四种数据模型:

    • Table(表)
    • External Table(外部表)
    • Partition(分区)
    • Bucket(桶)

    (1)表的概念和关系型数据库的表很像,只不过hive中的表的本质是结构化数据,存储在hdfs文件系统的目录中。这个目录就是前文着重要求的metastore的位置,文件就是存在那里的。

    (2)外部表顾名思义,就是数据不存放在所属目录中,而是存放在别处。

    (3)分区,这个很重要,我觉得分区的存在就是数据仓库与关系型数据库最大的区别,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。
    (4)桶:对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对应一个文件(注意和分区的区别)。

    Hive的元数据

    Hive的元数据一般都是放在mysql中的,这样的原因是因为Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,不能将Hive的元数据存储在HDFS中。

    hive数据的导入导出

    导入

    导入的方式有两种

    • 从本地导入数据
    • 从HDFS导入数据

    (1)从本地向hive导入数据
    语法:

    load data local
    inpath '/opt/dataaplace/...'
    (overwrite) into table tablename 
    partition (partitionfield = xxx);
    
    • 1
    • 2
    • 3
    • 4

    load data:表示导入数据

    local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表

    partition (…)表示指定导入数据的分区字段

    overwrite表示覆盖写入,如果没有则是追加写入

    例子:

    load data local
    inpath '/opt/data/StudentId.txt'
    overwrite into table Student;
    
    • 1
    • 2
    • 3

    (2) 加载HDFS文件到hive中
    语法:

    load data 
    inpath '/root/data/...'
    (overwrite) into table tablename 
    partition (partitionfield = xxx);
    
    • 1
    • 2
    • 3
    • 4

    不加local默认从hdfs中导入数据

    hive创建表

    create table tablename
    (
    id int,
    name string
    )
    row format delimited fields terminated by ',';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    前半部分和mysql的建表语句一样,后半部分是指定表的分隔符。

    • 插入数据
    insert into table tablename values(1,"zhangsan"),(2,"lisi");
    
    • 1

    insert into:以追加数据的方式插入到表

    insert overwrite into table tablename values(1,"zhangsan"),(2,"lisi");
    
    • 1

    加了overwrite 则是覆盖原来的表然后写入

    • 根据查询结果覆盖写入
    insert overwrite table tablename values(3,"wangwu")
    select id,name from tablename where id = 1;
    
    
    • 1
    • 2
    • 3
    • 创建表时通过Location指定加载数据路径
    create table tablename(
    	id int, name string
    )
    row format delimited fields terminated by '\t'
    location '/root/hive/wirehouse/...';
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    location 指定的是hdfs中的路径

    数据导出

    参考博客:添加链接描述

    # 1)将查询的结果导出到本地(只能overwrite,不能into,否则会报错)
    insert overwrite local directory '/opt/module/hive/datas/export/student' 
    	select * from student;
    
    # 2)将查询的结果格式化导出到本地(所有的insert语句都会跑MR)
    insert overwrite local directory '/opt/module/hive/datas/export/student1' 
    	ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
        select * from student;
    
    # 3)将查询的结果导出到HDFS上(没有local)(是复制,原来的文件还在)
    insert overwrite directory '/user/qinjl/student2'
    	ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    	select * from student;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意:insert 导出,导出的目录不用自己提前创建,hive会帮我们自动创建,但是由于是overwrite,所以导出路径一定要写具体,否则很可能会误删数据。

    • Hadoop命令也可以导出数据到本地
     dfs -get /user/hive/warehouse/student/student.txt
    				/opt/module/hive/datas/export/student3.txt;
    
    • 1
    • 2
    • Hive Shell 命令导出
    hive_dir/bin/hive -e 'select * from ods.order_info;' >> 
    /opt/module/datas/order_info.txt
    
    • 1
    • 2
    • hive表也可以通过export 导入到hdfs上
    export table ods.user_info to /user/hive/warehouse/user_info;
    
    
    • 1
    • 2
  • 相关阅读:
    Vue2源码学习笔记 - 15.响应式原理—nextTick
    生产实用Shell脚本合集
    『现学现忘』Git基础 — 17、Commit对象
    102. 管道漫游案例
    测试覆盖率治不好你的精神内耗
    el-table 列分页
    sigmoid和softmax函数有什么区别
    Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
    【链表的说明、方法---顺序表与链表的区别】
    ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别
  • 原文地址:https://blog.csdn.net/fuhao6363/article/details/136457538