Hive数据库基础


Hive 是一个基于 Hadoop 的数据仓库工具,用于在 HDFS 上进行大规模数据存储和管理。它提供了一种类 SQL 的查询语言 HiveQL(Hive Query Language),允许用户在无需深度掌握 MapReduce` 编程的情况下进行数据分析和查询。

Hive 的底层存储机制即数据文件,拥有 TextFileORC(Optimized Row Columnar)Parquet 等多种方式。在 Hive 中虽然提供类似关系型数据库的查询语法,但实际性能相对较低,实际应用中更多的是对于文件流的操作进而实现数据管理。

下面就让我们来了解一下 Hive 的一些相关的概念及知识。

一、DDL操作

1. 新建库

通过 create database 新建 Hive 数据库。

-- 创建数据库
create database <db_name>

2. 新建表

Hive 新建表与常见数据库基本一致,建表配置项参考下表:

方法 作用
PARTITIONED BY 用于指定分区列。
ROW FORMAT DELIMITED FIELDS TERMINATED BY 设置数据文件存储时字段值分割符。
STORED AS 设置表的类型,可选值:orc, lzo, avro, textfile。
-- 新建表
create table <db_name>.<tb_name>(  
    `<column_name>` <type> COMMENT '<column comment>'
)  
-- 表备注
COMMENT 'table comment'
-- 分区字段
PARTITIONED BY (`<column_name>` <type>) 
-- 自定义行记录分隔符
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001'  
-- 表类型
STORED AS <type>

二、DML操作

1. 新增数据

若表存在分区在插入时需要指定分区值。

-- 带分区
INSERT INTO <tb_name> 
PARTITION(<column_name> = '<value-1>') 
VALUES ('<value-1>', '<value-2>', ..., '<value-n>');

没有分区字段的表插入语法与普通数据库无异。

-- 无分区
INSERT INTO <tb_name> 
VALUES ('<value-1>', '<value-2>', ..., '<value-n>');

2. 文件插入

Hive 原生支持从文件读取数据插入,如准备如下 txt 文件,其中一行数据即为一条记录,不同值之间的分隔符与建表时指定时的一致即可。

123, alex, 20, china

读取插入语句如下:

-- 默认是 append , 使用 overwrite 则进行覆盖
load data local inpath '/path/test.txt' 
overwrite into table <tb_name> ;

三、基本函数

1. 时间函数

(1) from_unixtime

通过 from_unixtime 函数可将时间戳转化为字符串。

SELECT
    from_unixtime(unix_timestamp(time1), 'yyyy-MM-dd HH:00:00') AS time2,
    COUNT(*) AS num
FROM
    tb_user
WHERE
    time1 > unix_timestamp('2022-06-01', 'yyyy-MM-dd')
    AND
    time1 < unix_timestamp('2022-06-30', 'yyyy-MM-dd')
GROUP BY
    from_unixtime(unix_timestamp(time1), 'yyyy-MM-dd HH:00:00')
ORDER BY
    time2;
(2) unix_timestamp

通过 unix_timestamp 函数可将字符串转化为时间戳。

SELECT
    from_unixtime(unix_timestamp(time1), 'yyyy-MM-dd HH:00:00') AS time2,
    COUNT(*) AS num
FROM
    tb_user
WHERE
    time1 > unix_timestamp('2022-06-16 16:00:00', 'yyyy-MM-dd HH:00:00')
    AND
    time1 < unix_timestamp('2022-06-16 16:00:00', 'yyyy-MM-dd HH:00:00')+ INTERVAL 1 hour;

四、MetaStore

MetaStoreHive 库内部维护的元数据库,通过其即可直接访问 Hive 中表的元数据信息,在最新的 Hive 3 中支持单独部署。

1. 数据查询

(1) 表信息

通过 desc 关键字查询对应数据表的相关信息。

-- 查看建表语句
show create table <db_name>.<tb_name>;


-- 查看表统计信息(未格式化)
desc extended <db_name>.<tb_name>;


-- 查看表统计信息(格式化)
desc formatted <db_name>.<tb_name>;
(2) 分区信息

可通过 partition 关键字指定查询表的特定分区信息。

-- 查看分区结构
show partitions <db_name>.<tb_name>;


-- 查看指定分区下统计信息
desc formatted <db_name>.<tb_name> 
partition(<p_name_1> = '<p_value_1>', <p_name_2> = '<p_value_2>');
(3) 字段信息

同理,在 desc 查询表信息时可指定只查看特定列。

-- 查看字段信息
desc formatted <db_name>.<tb_name> <column_name>;

2. 数据分析

通过 analyze 关键字执行分析表,执行分析后将会更新对应表的文件占用与行数等信息。

-- 生成表统计信息(无分区)
analyze table <db_name>.<tb_name> compute statistics;


-- 生成表统计信息(有分区需指定)
analyze table <db_name>.<tb_name> partition(<partition_name>) compute statistics;


-- 生成表统计信息(多分区需全部指定)
analyze table <db_name>.<tb_name> partition(<partition_1>, <partition_2>) compute statistics;


-- 生成表统计信息(指定分区与值)
analyze table <db_name>.<tb_name> partition(<p_1> = <v_1>) compute statistics;

五、MetaData

MetaDataHive 库外部的元数据存储库,通常选择 MySQLPostgreSQL 作为 Hive 外部元数据库。

表名 描述
DBS 存储 HIVE 数据库基本信息。
DATABASE_PARAMS 存储数据库的相关参数。
TBLS 存储 HIVE 表、视图、索引等信息。
TABLE_PARAMS 存储表与视图的属性信息。
PARTITIONS 存储表的分区属性信息。
TBL_PRIVS 存储表与视图的授权信息。

1. DBS

资源表 DBS 存储 Hive 数据库基本信息

select 
    * 
from 
    DBS
where 
    NAME = '<db_name>';

2. TBLS

资源表 TBLS 存储 Hive 表、视图与索引等信息。

select 
    * 
from 
    TBLS
where 
    TBL_NAME = '<tb_name>';

3. TABLE_PARAMS

资源表 TABLE_PARAMS 存储 Hive 表与视图的属性信息,其中 TBL_IDTBLS 查询。

select 
    * 
from 
    TABLE_PARAMS
where 
    TBL_ID = <table_id>;

4. PARTITIONS

资源表 PARTITIONS 存储 Hive 表分区信息,其中 TBL_IDTBLS 查询。

-- 存储分区信息
select 
    * 
from 
    PARTITIONS
where 
    TBL_ID = <table_id>;

5. TBL_PRIVS

资源表 TBL_PRIVS 存储 Hive 表与视图的授权信息。

select 
    * 
from 
    TBL_PRIVS;

6. 组合查询

查看指定带分区的 Hive 表基本元数据信息。

select
    d.NAME, t.TBL_NAME, p.PART_NAME, v.PARAM_KEY, v.PARAM_VALUE
from
    TBLS t
left join DBS d
on
    t.DB_ID = d.DB_ID
left join PARTITIONS p
on
    t.TBL_ID = p.TBL_ID
left join PARTITION_PARAMS v
on
    p.PART_ID = v.PART_ID
where
    d.OWNER_NAME = 'hive'
    and d.NAME = '<db_name>'
    and t.TBL_NAME = '<tb_name>';

查看指定无分区的 Hive 表基本元数据信息。

select
    d.NAME,
    t.TBL_NAME,
    SUM(case when p.param_key = 'numFiles' then p.param_value else 0 end) as file_num,
    SUM(case when p.param_key = 'numRows' then p.param_value else 0 end) as row_num,
    SUM(case when p.param_key = 'totalSize' then p.param_value else 0 end) as total_size
from
    TABLE_PARAMS p
left join TBLS t
on
    p.TBL_ID = t.TBL_ID
left join DBS d
on
    t.DB_ID = d.DB_ID
where
    d.OWNER_NAME = 'hive'
    and d.NAME = '<db_name>'
    and t.TBL_NAME = '<tb_name>';

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录