Hive数仓

一、分层

理论上分为三层:ODS数据运营层,DW数据仓库层,ADS数据服务层.

数据运营层(ODS):原始数据:

  ODS:Operation Data Store 数据准备区,也称为贴源层。数据仓库源头系统的数据表通常会原封不动的存储一份,这称为ODS层,是后续数据仓库加工数据的来源。

数据仓库层(DW):数据清洗:

  1. DWD:data warehouse details 细节数据层,是业务层与数据仓库的隔离层。主要对ODS数据层做一些数据清洗和规范化的操作。
    数据清洗:去除空值、脏数据、超过极限范围的
  2. DWB:data warehouse base 数据基础层,存储的是客观数据,一般用作中间层,可以认为是大量指标的数据层。
  3. DWS:data warehouse service 数据服务层,基于DWB上的基础数据,整合汇总成分析某一个主题域的服务数据层,一般是宽表。用于提供后续的业务查询,OLAP分析,数据分发等。

数据服务层/应用层(ADS):出报表

  ADS:applicationData Service应用数据服务,该层主要是提供数据产品和数据分析使用的数据,一般会存储在ES、mysql等系统中供线上系统使用。

二、内部表vs外部表

1、内部表

内部表,也叫托管表,是Hive在创建表时的默认表。
特点:在内部表被删除后,表的元数据和表数据都从HDFS中完全删除
建表代码:

create table if not exists 表名(
字段名称 字段类型,
...
字段名称 字段类型
)
comment 表的注释
raw format delimited
fields terminated by '分隔符'  #列以'分隔符'分割
line terminated by '分隔符'   #此分隔符只能是‘\n’,目前hive只支持‘\n’,行分割也是默认‘\n’
stored as 文件存储类型 #常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、      #TEXTFILE(文本)、RCFILE(列式存储格式文件)如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

适用场景:
ETL数据清理是用内部表做中间表,清理时HDFS上的文件同步删除
查看所建的表的全部信息----其中Table Type 表示表的类型
(内部表Internal TABLE/Managed TABLE,外部表EXTERNAL TABLE)
在这里插入图片描述
内部表数据存储的位置是hive.metastore.warehouse.dir,如果创建内部表时没有指定location,就会在/user/hive/warehouse/下新建一个表目录

2、外部表

特点:表中的数据在删除后仍然在HDFS中。
如果我们创建一个外部表,在删除表之后,只有与表相关的元数据被删除,而不会删除表的内容。
声明外部表的关键字:external
声明外部表的基本语法:

create external table if not exists 表名(
字段名称 字段类型,
...
字段名称 字段类型
)
raw format delimited

fields terminated by '分隔符'

将数据加载至hive表中

hive> load data local inpath '/opt/student.txt' into table student2;

将外部表删除

hive> drop table student2;

查看HDFS路径下是否保留表数据

[root@master ~]# hadoop fs -cat /data/hive/warehouse/student2/student.txt

在这里插入图片描述
外部表适用场景:
对于恢复误删的数据困难的情况,例如:实时采集的数据
外部表的优点:
可以共享数据,且不加载到hive中,减少数据加载,落地

3、管理表(内部表)与外部表互相转换

查询已有表的类型

hive> desc formatted student;

修改内部表student为外部表

hive> alter table student set tblproperties('EXTERNAL'='TRUE');

修改外部表student为内部表

hive> alter table student set tblproperties('EXTERNAL'='FALSE');

三、分区

静态分区

创建分区表语法

create table stu(id string,name string) partitioned by (month string) row format delimited fields terminated by '\t';

加载数据

hive> load data local inpath '/home/test/stu.txt' into table student partition(classroom='002');
Loading data to table default.student partition (classroom=002)
OK
Time taken: 1.102 seconds

查看分区

hive> show partitions student;
OK
classroom=002
Time taken: 0.071 seconds, Fetched: 1 row(s)

新增分区

alter table salary add partition(data_dt = '2021-07-22');

向分区表插入数据:

insert into salary partition(data_dt='2021-07-19') values ('10001','Eric',150000);

动态分区

启用hive动态分区(之前博客也写过)
在hive会话中设置两个参数:

hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict;

不指定具体的学校和班级,让系统自动分配;

hive> insert overwrite table stu01 partition(school,classroom) 
    > select * from stu;

插入数据时字段要对应分区名

insert into student partition(address,school) select name,age,'shanghai' as address,school from stu; 
### Hive 库的使用与配置 Hive 是一种基于 Hadoop 的库工具,用于管理和查询大规模分布式据集。它通过 SQL 风格的语言(称为 HiveQL)提供了一种高效的方式来处理存储在 HDFS 上的据。 #### 1. **元据管理** Hive 使用元据来描述其内部的对象结构,例如表、列和分区等信息[^1]。这些元据通常被存储在一个外部的关系型据库中,如 MySQL 或 Derby。为了确保 Hive 能够正常运行并优化查询性能,正确配置元据存储至关重要。 以下是常见的元据配置方式: ```xml <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.cj.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>Password@123</value> </property> </configuration> ``` 此配置指定了连接到 MySQL 据库的方式以及所需的用户名和密码[^4]。 --- #### 2. **HDFS 存储目录配置** 在实际部署 Hive 之前,需要先在 HDFS 中创建必要的存储目录。这可以通过以下命令完成: ```bash hadoop fs -mkdir /tmp hadoop fs -mkdir -p /user/hive/warehouse hadoop fs -chmod g+w /tmp hadoop fs -chmod g+w /user/hive/warehouse ``` 上述命令分别创建了 `/tmp` 和 `/user/hive/warehouse` 目录,并赋予组写权限以便于后续操作[^2]。 --- #### 3. **常见问题及其解决方法** ##### (a) **Hadoop 服务启动失败** 如果 `systemctl start mysqld` 命令失败并提示 Unit not found,则可能是由于 MySQL 服务未正确安装或服务名称不匹配。此时应验证 MySQL 是否已成功安装,并检查服务名是否为 `mysqld`[^3]。 ##### (b) **RPM 包安装失败** 当执行 `rpm -ivh` 命令时发生错误,表明 RPM 包可能不存在于指定路径下。需重新确认包的位置并将其放置至系统可访问位置后再尝试安装[^3]。 ##### (c) **据插入性能低下** 若发现据插入过程耗时较长(如超过 200 秒),可以考虑调整 MapReduce 参或者优化集群资源配置以提升效率[^3]。 ##### (d) **MapReduce 作业失败** 针对 MapReduce 执行失败的情况,建议查看 Hadoop 日志文件定位具体原因。可能涉及的因素包括但不限于配置失误、资源短缺或是输入据格式异常等问题[^3]。 ##### (e) **版本兼容性问题** 务必注意所使用的 Hive 版本应当与当前 Hadoop 版本保持一致;否则可能会引发不可预期的行为甚至完全无法运作。查阅官方文档获取支持矩阵有助于规避此类风险[^3]。 --- #### 4. **总结** 综上所述,在构建及维护一个功能完备且高效的 Hive 库过程中,合理规划元据管理系统架构、精心设计物理存储布局以及妥善应对各类技术挑战均显得尤为重要。只有这样才能够充分发挥出该平台的优势所在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值