zoukankan      html  css  js  c++  java
  • Hive 学习记录

    Impala简介

    Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。

    已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。

    相比之下,Impala的最大特点也是最大卖点就是它的快速。

    Hive简介

      Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

         最初,Hive是由Facebook开发,后来由Apache软件基金会开发,并作为进一步将它作为名义下Apache Hive为一个开源项目。Hive 没有专门的数据格式。

    Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。Hive不适用于在线事务处理。 它最适用于传统的数据仓库任务

           Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询

      例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。

      Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,

    Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。

    Hive数据仓库基本结构

    ods层:原始数据层。

    dwd层:明细数据层。

    dws层:汇总数据层。

    app层:应用层。

    同步工具:shell脚本。

    bi层:业务层。

    Hive内部表和外部表的区别

    创建
    内部表:内部表直接创建,不需要加关键字
    外部表:外部表的创建需要加上external关键字修饰,可以通过location指定hive仓库的路径

    默认仓库路径
    内部表:内部表的默认创建路径在:/user/hive/warehouse/database.db/xm_testA
    外部表:外部表的默认创建路径在:/user/hive/warehouse/database.db/xm_testB

    drop 表
    内部表:内部表删除后会将元数据和路径下的文件都删除
    外部表:外部表只删除元数据,不删除路径下的文件

    load加载数据
    内部表:会把数据移动到自己指定的路径下
    外部表:会把数据移动到自己指定的路径之外

    Hive分区

    数据分区的概念以及存在很久了,通常使用分区来水平分散压力,将数据从物理上移到和使用最频繁的用户更近的地方,以及实现其目的。

    hive中有分区表的概念,我们可以看到分区具重要性能优势,而且分区表还可以将数据以一种符合逻辑的方式进行组织,比如分层存储。

    分区表分别有静态分区和动态分区

    create external table employees_ex
     (
     name   string,
     salary  float,
     subordinated array<string>,
     deductions map<string,float>,
     address  struct<street:string,city:string,state:string,zip:int>
     )
     partitioned by (country string,state string)
     row format delimited
     fields terminated by "	"
     collection items terminated by ","
     map keys terminated by ":"
     lines terminated by "
    "
     stored as textfile;   
     location "/user/had/data/"    //他其实和普通的静态分区表一样就是多了一个external关键字

    Hive常用命令

    
    


    # 启动 hive
    bin/hive

    
    

    # 查看数据库
    hive> show databases;

    
    

    # 打开默认数据库
    hive> use default;

    
    

    # 显示 default 数据库中的表
    hive> show tables;

    
    

    # 创建一张表
    hive> create table student(id int, name string);

    
    

    # 显示数据库中有几张表
    hive> show tables;

    
    

    # 查看表的结构
    hive> desc student;

    
    

    # 向表中插入数据
    hive> insert into student values(1000,"ss");

    
    

    # 查询表中数据
    hive> select * from student;

    
    

    # 查询表创建语句
    show create table table_name;

    # 查询表分区
    show partitions table_name;

    
    

    # 退出 hive
    hive> quit;

     

    Hive 执行hql

    1、直接执行hql语句

    hive -e 

    2、执行hql文件(适合通用脚本封装,可传递不同的参数)

    hive -hivevar xxx -f xxx.sql

    命令行模式,或者说目录模式,可以使用hive 执行命令。
    
    选项说明:
    
    -e : 执行短命令
    
    -f : 执行文件(适合脚本封装)
     
    -S : 安静模式,不显示MR的运行过程
    
    -hivevar : 传参数 ,专门提供给用户自定义变量。
    
    -hiveconf : 传参数,包括了hive-site.xml中配置的hive全局变量。

    Hive常用函数

    row_number()函数

    ROW_NUMBER() OVER函数的基本用法

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

    详解:

    row_number() over (PARTITION BY COL1 ORDERBY COL2)表示根据COL1分组,在分组内部根据COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(该编号在组内是连续并且唯一的)。

    应用场景:排名,自增ID。

    Hive删除数据

    1、仅删除表中数据,保留表结构

    truncate:truncate用于删除所有的行,这个行为在hive元存储删除数据是不可逆的.不能删除外部表!因为外部表里的数据并不是存放在Hive Meta store中.

    truncate table table_name;

    2、删除表

    drop:删除hive中的表

    drop table table_name;

    3、删除表

    drop database if exists db_name;

    4、删除分区

    alter table table_name drop partition (partition_name='分区名')

    Hive shell

    #!/bin/bash
    #########################################################
    ## 功能:脚本
    ## 执行频率:每天定时执行一次,滚动前一天的表分区
    #########################################################
    . /etc/profile
    
    if [ "$1" != "" ] ;then 
      echo "有参数" 
      today=`date -d "$1 0 days ago" +"%Y%m%d"`  #今天日期
      yesterdaydate=`date -d "$1 1 days ago" +"%Y%m%d"`  #昨天日期
    else 
      echo "参数值为空" 
      today=`date -d '0 days ago' +"%Y%m%d"`  #今天日期
      yesterdaydate=`date -d '1 days ago' +"%Y%m%d"`  #昨天日期
    fi
    echo "昨天日期" $yesterdaydate
    
    HQL="SHOW PARTITIONS ods.ods_music_single_info;"
    dt=`hive -e "$HQL"`
    array=(${dt// dt=/ })
    len=${#array[@]}
    last_second_partition=${array[$len-2]}
    last_second_partition=${last_second_partition#*=}
    echo "两个小时前的分区 $last_second_partition"
    
    HQL_ALL="
    
    set hive.mapred.mode=nonstrict;
    set hive.strict.checks.cartesian.product=false;
    set hive.auto.convert.join=false;
    -- add jar /app/tools/lib/json-serde-1.3.8-jar-with-dependencies.jar;
    
    insert overwrite table dws.tablename partition (dt = '${yesterdaydate}')
    select 
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  这里遇到有依赖分区的数据,参照dt = '${yesterdaydate}' 或者 $last_second_partition
    ;
    "
    echo "开始执行 HQL_ALL"
    echo "$HQL_ALL"
    hive -e "$HQL_ALL"
    echo "HQL_ALL 执行完毕"

    其他

    case

    case具有两种格式。简单case函数和case搜索函数。
    
    --简单case函数
    
                case sex
    
                when '1' then ''
    
                when '2' then ''
    
                else '其他' end
    
    --case搜索函数
    
                case when sex = '1' then ''
    
                when sex = '2' then ''
    
                else '其他' end

    登录

    ssh -p 20422 wei.wang@172.31.60.100
    输入验证码
    出现欢迎界面
    回车出现可访问的机器列表
    输入相应数字 回车
    切换root账户:su - 
    输入root密码
    sudo su -
    su - hdfs
    sudo su - hdfs
    hive
    show tables in dws;
    show create table xxx;
    show partitions xxx;
    
    sudo -uhdfs sh series_top.sh
    sudo -uhdfs sh series_top.sh 20200909
    
    
    电视剧相关的SQL、sh脚本放到hadoop4的目录下
    /app/edw/aiads-edw/hive/daily/ods/spider/yuqing/series

    redash 

    {
    "collection":"series_top_list",
    "query":{"code":"tengxunshipin"},
    "sort":[{"name":"ranking","direction":-1}]
    }

    工具

    HUE

    HUE是一个开源的Apache Hadoop UI系统,早期由Cloudera开发,后来贡献给开源社区。它是基于Python Web框架Django实现的。通过使用Hue我们可以通过浏览器方式操纵Hadoop集群。例如put、get、执行MapReduce Job等等。

    注意:${var} 可视化参数设置

    Azkaban

    Azkaban是由Linkedin公司推出的一个批量工作流任务调度器,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的key:value对的方式,

    通过配置中的dependencies 来设置依赖关系,这个依赖关系必须是无环的,否则会被视为无效的工作流。Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

    在介绍Azkaban之前,我们先来看一下现有的两个工作流任务调度系统。知名度比较高的应该是Apache Oozie,但是其配置工作流的过程是编写大量的XML配置,而且代码复杂度比较高,不易于二次开发。

    另外一个应用也比较广泛的调度系统是Airflow,但是其开发语言是Python。由于我们团队内部使用Java作为主流开发语言,所以选型的时候就被淘汰掉了。

    我们选择Azkaban的原因基于以下几点:

    提供功能清晰,简单易用的Web UI界面

    提供job配置文件快速建立任务和任务之间的依赖关系

    提供模块化和可插拔的插件机制,原生支持command、Java、Hive、Pig、Hadoop

    基于Java开发,代码结构清晰,易于二次开发

    参考资料:

    shell date 获取昨天日期

    Linux上shell脚本date的用法

    shell中脚本参数传递的两种方式

    Mac, linux 命令篇 ------ scp

    通过堡垒机/跳板机实现文件在本地Mac与服务器之间的互传

    hive简介

    Hive-基本操作

    Hive操作——删除表(drop、truncate)

    Hive之insert into与insert overwrite区别

    hive的常用交互命令 -hivevar 参数传递

    hive中的hiveconf与hivevar区别以及其作用域

    HIVE-执行hive的几种方式,和把HIVE保存到本地的几种方式

    hivef:hive 执行 sql 文件

    hive分区表详细介绍

    Hive动态分区

    HIVESQL中ROW_NUMBER() OVER语法以及示例

    Hive应用:设置字段自增

    Hive内部表和外部表的区别

    总结:Hive性能优化上的一些总结

    HUE安装与使用

    Azkaban 简单入门

    Azkaban使用详解

  • 相关阅读:
    安装MySQL ODBC应注意的问题
    AJAX跨域资源共享 CORS 详解
    RealThinClient SDK 学习笔记(1)
    mysql中两表更新时产生的奇葩问题,产生死锁!
    MySQL使用FEDERATED engine建立代理表
    Java Collection与ConcurrentModificationException
    Maven 命令
    多线程12-ManualResetEventSlim
    多线程11-AutoResetEvent
    多线程10-SemaphoreSlim
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/12603540.html
Copyright © 2011-2022 走看看