Hive 通过顺序扫描磁盘来处理大量非结构化数据的大数据系统

目录

一、基础Hive查询语言

创建数据库

创建表

加载数据

二、Hive数据分析

分组

二、Hive数据基本类型

三、常用Hive操作命令

1. 数据定义


一、基础Hive查询语言

创建数据库

# 创建数据库
CREATE DATABASE log_data;

CREATE SCHEMA log_data;

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_hive

 

# 检查是否存在,不存在则创建
CREATE DATABASE log_data IF NOT EXISTS log_data;
# 验证是否已经创建了数据库,返回所有数据库及磨人的Hive数据库
SHOW DATABASES;

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_HQL会自动在hadoop上创建文件嘛_02

 

# 设置工作数据库
USE log_data;

创建表

# 创建表
CREATE TABLE apache_log(
    `host` STRING,
    `identity` STRING,
    `user` STRING,
    `time` STRING,
    `request` STRING,
    `status` STRING,
    `size` STRING,
    `referer` STRING,
    `agent` STRING
);

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_hive_03

 

# 使用ROW FORMAT 子句告诉Hive如何读取文件中的每一行,并映射到列
CREATE TABLE shakespeare(
    lineno STRING,
    linetext STRING
)
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t';

【指明数据位于由制表符分隔字段的文件中】

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_学习_04

 检查存在的表

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_hive_05

 

使用Hive的serializer-deserializer行格式选项SERDE和RegexSerDe库来指定反序列化,并将字段映射到表列的正则表达式。

# 添加JAR到当前hive会话,以便使用RegexSerDe包
ADD JAR /export/servers/apache-hive-2.3.9-bin/lib/hive-serde-2.3.9.jar;

# 删除之前创建的apache_log表,使用自定义序列器重新创建它
 DROP TABLE apache_log;

CREATE TABLE apache_log(
    `host` STRING,
    `identity` STRING,
    `user` STRING,
    `time` STRING,
    `request` STRING,
    `status` STRING,
    `referer` STRING,
    `agent` STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\])([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s")
STORED AS TEXTFILE;
# 验证表定义
DESCRIBE apache_log;

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_数据仓库_06

加载数据

Hive 与传统RDBMS在强化模式上有一个重要区别:Hive不会对数据执行任何证明它是否符合表模式的验证,也不会再将数据加载到表中时执行任何转化。

Hive中的数据加载通过LOADDATA命令批量完成,也可以使用INSERT命令插入另一个查询的结果完成。

# 去servers目录下
cd /export/servers

# 下载log文件
wget https://github.com/bbengfort/hadoop-fundamentals/raw/master/data/log_data.zip

# 解压
unzip log_data.zip

# 进入目录
cd log_data

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_hive_07

# 将 Apache 日志数据文件复制到HDFS,加载到之前创建的表中
hadoop fs -copyFromLocal apache.log statistics/log_data/
# 验证是否上传成功
hadoop fs -tail statistics/log_data/apache.log

 

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_hive_08

 

# 上传成功,返回Hive CLI使用log_data数据库
hive


hive>  use log_data;
# 使用LOAD DATA命令,指定日志文件的HDFS路径,将内容写入apache_log表
LOAD DATA INPATH 'statistics/log_data/apache.log' OVERWRITE INTO TABLE apache_log;



【
    LOAD DATA 是 Hive 的批量加载命令
    INPATH 携带一个指向默认文件系统中的路径的参数(这里是HDFS)
    可以用 LOCAL INPATH 指定本地文件系统上的路径
    Hive 将文件移动到仓库位置
    若使用 OVERWRITE 关键字,则目标表中所有已有数据将被删除并由数据文件输入替换,否则,新数据被添加到表中
】
# 运行 SELECT COUNT验证实际行数,这个Hive查询运行时,实际上执行了一个MapReduce作业来进行聚合
SELECT COUNT(1) FROM apache_log;

HQL会自动在hadoop上创建文件嘛 hadoop建表语句_数据仓库_09

二、Hive数据分析

经过上一步,已经定义了一个模式并且将数据加载到了Hive中,下面,编写并运行HQL对导入的Apache日志访问数据进行分析,确定远程流量访问的高峰月份。

分组

使用 SET hive.map.aggr = true; 提升聚合查询性能


# 分组查询
 SELECT month, count(1) AS count from (SELECT split(time, '/')[1] AS month FROM apache_log) l GROUP BY month ORDER BY count DESC;
# Hive简洁自然的查询接口来执行分组,数据被结构化为Hive表
SELECT host, count(1) AS count FROM apache_log GROUP BY host ORDER BY count;

 

便于分析,创建新表存储查询返回的结果信息

# CTAS操作能从现有Hive表过滤和聚合,从而派生并构建新表
CREATE TABLE 
    remote_hits_by_month
    AS
SELECT
    month,
    count(1) AS count
FROM(
    SELECT split(time, '/')[1] AS month
    FROM apache_log
    where host == 'remote'
) l 
GROUP BY month
ORDER BY count DESC;

二、Hive数据基本类型

基本数据类型主要有数值类型(INT、FLOAT、DOUBLE ) 、布尔型和字符串;

复杂类型有三种:ARRAY、MAP 和 STRUCT。

1. 基本数据类型

  • TINYINT: 1个字节
  • SMALLINT: 2个字节
  • INT: 4个字节
  • BIGINT: 8个字节
  • BOOLEAN: TRUE/FALSE
  • FLOAT: 4个字节,单精度浮点型
  • DOUBLE: 8个字节,双精度浮点型STRING 字符串

2. 复杂数据类型

  • ARRAY: 有序字段
  • MAP: 无序字段
  • STRUCT: 一组命名的字段

三、常用Hive操作命令

1. 数据定义

主要用于创建修改和删除数据库、表、视图、函数和索引。

创建、修改和删除数据库

【除 dbproperties属性外,数据库的元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置,没有办法删除或重置数据库属性】

# 创建数据库
create database if not exists hive;

# 查看Hive中包含的数据库
show databases;

# 查看Hive中以h开头的数据库;
show databases like 'h.*';

# 查看Hive数据库的位置等详细信息
describe databases;

# 为hive设置键值对属性
alter database hive set dbproperties;

# 切换到hive数据库下
use hive;

# 删除不含表的数据库
drop database if exists hive;

# 删除数据库和它中的表
drop database if exists hive cascade;

创建、修改、删除表

# 创建内部表(管理表)
create table if not exists zyy.usr(
    name string comment 'username',
    pwd string comment 'password',
    address struct<street:string,city:string,state:string,zip:int> comment 'home address',
    identify map<int,tinyint> comment 'number,sex') 
    comment 'description of the table'
    tblproperties('creator'='me','time'='2023.3.6'); 


#创建外部表
create external table if not exists usr2(
    name string,
    pwd string,
    address struct<street:string,city:string,state:string,zip:int>,
    identify map<int,tinyint>)
    row format delimited fields terminated by ','
    location '/usr/local/hive/warehouse/zyy.db/usr'; 



#创建分区表
create table if not exists usr3(
    name string,
    pwd string,
    address struct<street:string,city:string,state:string,zip:int>,
    identify map<int,tinyint>) 
    partitioned by(city string,state string);  

  
#复制usr表的表模式  
create table if not exists zyy.usr1 like zyy.usr;
 
show tables in zyy;  
show tables 'u.*';        #查看hive中以u开头的表
describe zyy.usr;        #查看usr表相关信息
alter table usr rename to custom;      #重命名表
 

#为表增加一个分区
alter table usr2 add if not exists 
    partition(city=”beijing”,state=”China”) 
    location '/usr/local/hive/warehouse/usr2/China/beijing'; 


#修改分区路径
alter table usr2 partition(city=”beijing”,state=”China”)
    set location '/usr/local/hive/warehouse/usr2/CH/beijing';

#删除分区
alter table usr2 drop if exists  partition(city=”beijing”,state=”China”)

#修改列信息
alter table usr change column pwd password string after address;
 
alter table usr add columns(hobby string);                  #增加列
alter table usr replace columns(uname string);              #删除替换列
alter table usr set tblproperties('creator'='liming');      #修改表属性
alter table usr2 partition(city=”beijing”,state=”China”)    #修改存储属性
set fileformat sequencefile;             
use hive;                                                   #切换到hive数据库下
drop table if exists usr1;                                  #删除表
drop database if exists hive cascade;                       #删除数据库和它中的表