hive安装及相关命令

Hive:
 sql on hadoop
用途:
 1.sql
 2.udf
hadoop:
 hdfs: 命令行、api
 yarn: 提交作业    (mr spark flink) on yarn
 mapreduce: 编程 核心类 思想

mr弊端:
 1.开发大量代码
 2.业务变更,修改代码不方便
 大数据处理,最终落地最好是SQL:
  大数据开发两个角度:
   1.基础平台  涉及底层面较广
   2.应用层面开发  写sql
   如何选择:兴趣点+公司定位
 3.对sql 不友好
mr :批处理   离线计算
由于mr的弊端=》产生了hive
hive:
 1.官网   hive.apache.org
 2.谁提出来的:Facebook开源,去解决海量结构化数据的统计问题
 3.hive是什么   :构建在hadoop上的数据仓库
   hdfs:  hive的数据是在hdfs上的
   yarn:hive的作业是跑在yarn上的
   mapreduce: hive的作业可以以mr的方式去运行
 4.如何使用呢
  1.定义了一个类  sql语言==》  类似sql
  2.适用于批处理、离线计算
  3.hive就是写sql => mr作业 =》 yarn上运行  
   hive引擎:
    mr: 把sql转变成 mr作业去运行
    tez: sql =>tez
    spark : sql =>spark
    
    hive on spark :hive的引擎选用的是spark
    spark on hive : 使用sparksql去连接 hive去查询
  4.hive 数据存储 压缩、文件存储格式

1.
2.
3.版本  x.y.z
 x: 大版本
 y:小版本
 z: 小版本bug的修复

hive介绍:
 1.为什么学习hive  简单易学
 2.扩展性好:
  1.udf
  2.hadoop
  3.metastore
hive架构:
 client:主要负责sql
 driver:sql解析、逻辑优化、物理执行计划
 引擎:
 数据:
 作业:
 元数据:
hive部署:
常见问题:(面试)
 hive与mysql的区别:
  1.共同点:都使用sql语言
  2.延时性:hive 慢   hive与mysql属于两个范畴,使用场景不同
  3.事务:都支持 大数据场景下不使用
  4.sql语法:
   hive:建议使用:   insert into table
      select * from

    不建议使用:update delete 
      insert into table values();
  5.分布式:理论上都支持,hive可以借助hadoop完成分布式部署
  6.数据体量:hive要远大于mysql  mysql几T数据就不太行
部署步骤:
 上传安装包并解压  [hadoop@digdata22 software]$ tar -zxvf ./apache-hive-3.1.3-bin.tar.gz  -C ~/app
 软连接   ln -s apache-hive-3.1.3-bin hive
 环境变量  [hadoop@digdata22 app]$ vim ~/.bashrc
       
   #HIVE_HOME
   export HIVE_HOME=/home/hadoop/app/hive
   export PATH=${HIVE_HOME}/bin:${PATH}

 生效:[hadoop@digdata22 app]$ source ~/.bashrc

 启动:
  1.初始化  不是说所有的版本都需要初始化
  cdh 
  apache
  
  schematool -dbType derby -initSchema
 修改元数据库
  
  [hadoop@digdata22 conf]$ cp hive-default.xml.template hive-site.xml
  
  
<property>
    <name>javax.jdo.option.ConnectionURL</name> 
    <value>jdbc:mysql://192.168.10.4/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
</property>

<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>

<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>root</value>
</property>

导入mysql驱动
/home/hadoop/app/hive/lib           mysql-connector-java-8.0.21.jar

初始化
schematool -dbType mysql -initSchema
-----------------------------------------------------------------------------------------
1.查看版本 : 
    去元数据库查看: 
        mysql> select *  from VERSION ;

2.创建一张表    

hive> create table shuke_student(name string);
插入数据
hive> insert into table shuke_student values ('yangle'),("zhangsan");   

//hive中数据存储在hdfs上

思考: 
    表中的数据存在哪里?
        TBLS 【表信息】
        hdfs://bigdata22:9000/user/hive/warehouse

    1. DB_ID: 1

hive: 
    数据: hdfs 
        hdfs://bigdata22:9000/user/hive/warehouse
    元数据:MySQL
        TBLS 【表信息】
        DBS 【库信息】
        COLUMNS_V2 【表中字段】

    hive 里面的表 =》 会被拆分成 N 表 

    /user/hive/warehouse/shuke_student【shuke_student 对应hdfs路径】
    
查找日志:
    [hadoop@bigdata22 conf]$ vim hive-log4j2.properties
    property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name}   //在 cd /tmp/hadoop/里面有hive.log
              property.hive.log.file = hive.log
       改变日志路径:[hadoop@bigdata22 hive]$ mkdir logs   /home/hadoop/app/hive
          [hadoop@bigdata22 conf]$ vim hive-log4j2.properties
          property.hive.log.dir = /home/hadoop/app/hive/logs/
       

hive的配置: 
    配置参数:【终端】
    hive.cli.print.header            //显示头信息  列名 表名
    hive.cli.print.current.db         //hive (default)>
    hive.metastore.warehouse.dir 【hive default(默认)库表 数据存放路径】

配置参数: 
    hive-site.xml : 【hive 配置文件】 =》 全局配置
        <property>
            <name>hive.cli.print.header</name>            
            <value>true</value>
        </property>

        <property>
            <name>hive.cli.print.current.db</name>
            <value>true</value>
        </property>

如何查看 参数的默认值? 
    set key;  [查看]   hive (default)> set hive.metastore.warehouse.dir;
                        hive.metastore.warehouse.dir=/user/hive/warehouse
                        
    set key=value [设置]  set hive.cli.print.current.db=false;

配置hive参数 优先级: 
    1.hive-site.xml 全局配置
    2.会话中设置 【】  //set key=value,仅仅当前会话生效
    3.hive  
        hive --hiveconf hive.cli.print.current.db=false; [当前会话生]

hive 命令行: 
    -e  sql   //   hive -e "select * from default.shuke_student"
    -f  sql文件   // [hadoop@bigdata22 hive]$ hive -f ./1.sql
    -i  hive初始化一些操作【udf】

hive -e "select *  from default.shuke_student"
hive -f xx.sql


crotab 
azkaban 
xxl 
dl 

3.语法: 

DDL: 
     Data Definition Language     //定义表定义库

database: hive默认有一个数据库 default :/user/hive/warehouse

在hive中:1.database、table对应hdfs上 文件夹、目录
          2.分区也对应文件夹
          3.桶对应文件
          
          databa
          
      table     table    table
     分区
     桶

1.创建数据库 
CREATE [REMOTE] (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]   //自己增加路径
  [LOCATION hdfs_path]    //自己指定存储的位置
  [MANAGEDLOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];

[] 可有可无
(|) 选择其中一个即可 
... 多个

create database bigdata_hive;
    bigdata_hive:  在hdfs上的路径
        /user/hive/warehouse/bigdata_hive.db

    database 在hdfs上的路径: 
        默认数据库: default 
            /user/hive/warehouse
        非默认数据库:
            /user/hive/warehouse/dbname.db    网页上 bigdata22:9870

create database IF NOT EXISTS bigdata_hive;

create database bigdata_hive2 LOCATION '/data/bigdata_hive2';  //自己指定存储的位置

mysql> select * from DBS \G;  //查看数据库位置  hdfs://bigdata22:9000/data/bigdata_hive2    http://bigdata22:9870/

create database bigdata_hive3 COMMENT 'it is a bigdata_hive3 database' 
WITH DBPROPERTIES ('create_user'='sxwang','create_time'='2099-05-01');

修改数据库: 
    1.数据库  名字不要动 

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);   -- (Note: SCHEMA added in Hive 0.14.0)
alter database bigdata_hive3 SET DBPROPERTIES('create_time'='2033');


hive里面数据: 
    1.数据: hdfs 
    2.元数据: mysql 

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];


drop database bigdata_hive3;
drop database bigdata_hive3 CASCADE;   //强行删除


hive table: 
列的数据类型: 
    data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type 

primitive_type: 
    1数据类型: 
        int            整型
        bigint [long]  长整型

        float      单精度
        double         双精度
        decimal        精度更多 
    
    2.字符串: 
        STRING  字符串 
    
    3.日期: 
        DATE      yyyy-mm-dd
        TIMESTAMP  yyyy-mm-dd hh:mm:ss  => 毫秒数 bigint
    

创建表: 
    CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement]; 


create table student(
id int ,
name string 
) ROW FORMAT  DELIMITED  FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

show tables;

1.插入表中数据: 
    1.insert into  table values(''); [不要用] =》 mr 

        insert into table as select xxx from xx ;

2.load : 加载数据 
    1.本地
    2.hdfs 上数据
    3.覆盖数据 =》 update 

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

本地:【数据不会丢失】
load data local inpath '/home/hadoop/data/student.txt' into  table student ;

hdfs:[input 数据没了] 
    load data  inpath '/data/student.txt' into  table student ;
    hive =》 ods层 load 

    日志数据 =》 flume =》 hdfs =》etl(spark) => hdfs  =》load data  =》 hive 
    日志数据 =》 flume =》 hdfs =》etl(spark) =》 hive 

    日志数据 =》 flume =》 hive

本地: 
load data local inpath '/home/hadoop/data/student.txt' OVERWRITE into  table student ;

table: 
    每天的数据: 
    没有分区: 
        19 20 21 

insert : 
    1.insert into values 
    2.insert into table sql 

insert into/OVERWRITE TABLE student01 select * from student;

建表: 
    1.create () 
    2.create table student01 like student; 【仅仅拿表结构】
    3. create table student02 as sql ; [mr] [临时查询 adhoc ]

清空表数据: 
    1.drop table 
    2.truncate 

删除某条数据: 
    1.update delete 
    =》 load insert 数据覆盖的方式 来更新数据


table: 

分区: 


sql: 
    1.function :
        聚合
        etl 
    2.udf 
    3.数组
    4.开窗
    5.join union 子查询 

    6.案例分析 =》 
            查sql 
    7.行转列 列转行
        case when  
        explode 

insert OVERWRITE tabl xxx partittion (dt='20220520')
select 
xxx,
dt 
from xx 

insert OVERWRITE tabl xxx partittion (dt)
select 
xxx,
'20220520' as dt 
from xx 

insert OVERWRITE tabl xxx partittion (dt)
select 
xxx,
dt 
from xx  

文件存储格式: 
    行式 
    列式 

文件压缩格式: 
    gzip 
    bzip2 
    snappy 
    lzo 

调优: 
    1.数据倾斜: 
        group by  
        join  
    2.解决: 
        udf key 打散 
        join: 
            大小表问题: 
                mapjoin 
                reduce join []
    
    3.数据跑的慢 ,没有数据倾斜 ? 
        拆分sql 
        条件筛选: 
    
    4.explain =》 不用


xxl sqoop  flume [2-3]  kafka spark  => 离线数仓 、平台【 同步工具】 【实时同步平台】 

hive [1]
hive [1.5]

hive [3-4]


hive : 

select : 

create table p_user(
    id int ,
    name string ,
    age int
)
ROW FORMAT  DELIMITED  FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

load; 
load data local inpath '/home/hadoop/data/p_user.txt' into table p_user;

1.where 【条件过滤】
column  < > = and or in not in  between .. and 

2.order by 排序 [全局排序] 
    注意; mapreduce
    影响: reduce输出的时候 只有一个 reduce task 处理排序
    asc 
    desc 

    Order, Sort, Cluster, and Distribute By 【排序】

input => map => reduce => output 
                        order by  => 全局排序

        1    =》 
        1        1  =》 1 order =》 1 
        1        1                   1

电影类广告的收益 : 
    1   100
    2   200
    3   50 

3.like 模糊匹配 regexp  rlike 
 where name =""

    1.% 模糊
    2._ 占位 

select *  from xx where name REGEXP 'xxx|yyy|zzz|ttt'

4.合并表
    1.union 
    2.union all 

5.null 
    where 
        is  is not 

    etl: 
        脏数据: column 值 是 null 'null' '' 'NULL'  => 
            1.etl 
            2.过滤掉
            String =》 'unkown'
            数值:=》 0 
    处理空值的函数: 
        ifnull 
        nvl 
        coalesce 
6.聚合函数 
    group by  + 聚合函数

    sum 
    count 
    max 
    min 
    avg

7.join 
    inner join 
    left join 
    right join 
    full join 

join: 
    reduce 没有 【map join 】
    map  reduce  => join 


table : 
    1.种类: 
        1.管理表/内部表 | 外部表
        2.普通表| 分区表 

CREATE [EXTERNAL] TABLE 

普通表:
    内部表: 
        CREATE  TABLE 
    外部表:
    CREATE EXTERNAL TABLE 

1.内部表 | 外部表 区别: 
    1.内部表: 
        1.删表: hdfs上的数据 被删除 + 元数据里面的数据 也被删除 
    2.外部表: 
        1.删表:元数据里面的数据 也被删除

    使用场景: 
        1.外部表 一般不用【不用】
        2.生产上不会有删表 操作
            【重新创建一个】

内部表: 
CREATE TABLE student_manager(
  `id` int, 
  `name` string)
ROW FORMAT  DELIMITED  FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

load data local inpath '/home/hadoop/data/student.txt' into table student_manager;

外部表:
CREATE EXTERNAL TABLE student_extenal(
  `id` int, 
  `name` string)
ROW FORMAT  DELIMITED  FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
load data local inpath '/home/hadoop/data/student.txt' into table student_extenal;

删表: 
    内部表:
         删表: hdfs上的数据 被删除 + 元数据里面的数据 也被删除 
    外部表:
        删表:    元数据里面的数据 也被删除


    表备份: 
        hive: hadoop01 a => 数据迁移 hadoop02 
        drop table a;
    
    外部表: 

hive -f  xxx.sql => xxl  => T+1 

hive: 
    ods 
    dwd  ttl  7天
    dws  ttl  7天
    rpt 

alter table drop parition (dt=''); =>xxx.sql


普通表| 分区表: 
    1.普通表: 
CREATE EXTERNAL TABLE student_extenal(
  `id` int, 
  `name` string)
ROW FORMAT  DELIMITED  FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

    2.分区表: 
        1.hive中的分区就是分目录【对比mR 分区】

    /user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990503/
    /user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990502/
    /user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990501/

        2.提升查询效率
            1.普通表: 
            /user/hive/warehouse/bigdata_hive.db/student_extenal/表中数据 【03 02 01】 

            2.分区表:
            /user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990503/表中数据 
            /user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990502/表中数据 
            /user/hive/warehouse/bigdata_hive.db/student_extenal/dt=20990501/表中数据 
    
    select * from where dt='03';
        普通表:
        分区表:    


CREATE EXTERNAL TABLE student_extenal_p(
  `id` int, 
  `name` string)
PARTITIONED BY (dt string)
ROW FORMAT  DELIMITED  FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

load data local inpath '/home/hadoop/data/student.txt' into table student_extenal_p;


load data local inpath '/home/hadoop/data/student.txt' into table student_extenal_p PARTITION(dt='20990520');
load data local inpath '/home/hadoop/data/student.txt' into table student_extenal_p PARTITION(dt='20990522');

查数据: 


查看table 有多少个分区: 
    show parititions xx ; 

删除分区 : 
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]

alter table student_extenal_p drop PARTITION(dt='__HIVE_DEFAULT_PARTITION__');


日志数据 =》 flume =》 hdfs =》etl(spark) => hdfs  =》load data 
                                                    mv      =》 hive 

日志数据 =》 flume =》  hive 

    hive: 
        日志表有了: 
             
hdfs: 0520 数据 

    load 
    hadoop fs -mv xxx  / /table/dt='0520'

hive: 
    paritition : 
        dt='0520' 
load :

    load data  inpath '/data/student.txt' into table student_extenal_p PARTITION(dt='20990530');

关联元数据: 
    1.MSCK REPAIR TABLE student_extenal_p;
        【不要用】
    2.ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

hdfs: 
    1.mkdir 
    2.mv  flume 
    3.查不到 
    3.关联元数据
        ALTER TABLE student_extenal_p ADD PARTITION(dt='20990601');
    

分区表插入数据: 
    1.load =》 几乎不用
            ods =》不用 
    
    2.insert into/OVERWRITE tablename  parition (dt='')
        ods  分区表dt 
        dwd  分区表dt 
        
        静态分区: 
        动态分区: 
            1.

input : 19 20 21  ==> hive 

    动态分区=》 sql 
    静态分区=》 3个sql 


CREATE EXTERNAL TABLE student_extenal_p(


CREATE EXTERNAL TABLE student_extenal_p2(
  `id` int, 
  `name` string)
PARTITIONED BY (dt string)
ROW FORMAT  DELIMITED  FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

静态分区:
insert OVERWRITE table student_extenal_p2 partition(dt='20990520')
select 
id ,
name 
from student_extenal_p
where dt='20990520';


动态分区:
set hive.exec.dynamic.partition.mode=nonstrict;
insert OVERWRITE table student_extenal_p2 partition(dt)
select 
id ,
name,
dt
from student_extenal_p
where dt='20990520';

insert OVERWRITE table student_extenal_p2 partition(dt)
select 
id ,
name,
'20990520' as dt
from student_extenal_p
where dt='20990520';


input : 19 20 21  ==> hive 

动态分区:

insert OVERWRITE table student_extenal_p2 partition(dt)
select 
id ,
name,
dt
from student_extenal_p
where dt in ("20990521","20990522","20990530");

静态分区:
insert OVERWRITE table student_extenal_p2 partition(dt='20990521')
select 
id ,
name 
from student_extenal_p
where dt='20990521';

insert OVERWRITE table student_extenal_p2 partition(dt='20990522')
select 
id ,
name 
from student_extenal_p
where dt='20990522';


数仓: 

xxx.sql: 
set hive.exec.dynamic.partition.mode=nonstrict;
insert OVERWRITE table student_extenal_p2 partition(dt)
select 
id ,
name,
dt
from student_extenal_p
where dt='var_dt';

shell: 

    dt= sed -i 's/var_dt/${dt}/g' xxx.sql

0520:
    hive -f xxx.sql  0520

teple.sql:
    set hive.exec.dynamic.partition.mode=nonstrict;
    insert OVERWRITE table student_extenal_p2 partition(dt)
    select 
    id ,
    name,
    dt
    from student_extenal_p
    where dt='var_dt';

    cat teple.sql >> ${dt}.sql 
    sed -i 's/var_dt/${dt}/g' ${dt}.sql
    hive -e "sql " 

 
  练习题: 
https://blog.csdn.net/GodSuzzZ/article/details/106935523?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-29-106935523.pc_agg_new_rank&utm_term=hive%E9%80%89%E6%8B%A9%E9%A2%98&spm=1000.2123.3001.4430

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值