Hive学习笔记

1 Hive基本概念

1.1 Hive定义

  • Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。
    Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并 提供类 SQL 查询功能。
    利用MapReduce去查询数据文件中的某些内容,需要编写大量冗余的程序,而Hive可以通过其独有的HQL语言来转化成MapReduce程序,能够简化编程。
    但是Hive只能处理结构化的数据文件,因此MapReduce能做的Hive并不一定能做,Hive能做的MapReduce一定能做。Hive的本质就是将HQL转化成MapReduce程序。
    Hive其实也可以看作一个hadoop的客户端,提供给用户输入HQL的入口,客户端再将HQL转化成MapReduce程序,并交由YARN去执行得到结果。
    在这里插入图片描述

  • Hive的优缺点:
    优点:
    (1)操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。
    (2)避免了去写 MapReduce,减少开发人员的学习成本。
    (3)Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。
    (4)Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较 高。
    (5)Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

    缺点:
    1)Hive 的 HQL 表达能力有限
    (1)迭代式算法无法表达(连续很多个MapReduce程序连接在一起,用HQL很难表达)
    (2)数据挖掘方面不擅长,由于 MapReduce 数据处理流程的限制,效率更高的算法却 无法实现。
    2)Hive 的效率比较低
    (1)Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
    (2)Hive 调优比较困难,粒度较粗(Hive调优只能从HQL语句上进行调优,深层次的调优需要从Hadoop进行调优)

1.2 Hive架构原理(面试重点)

  • 在这里插入图片描述

  • 1)用户接口(Client):
    CLI(command-line interface)
    JDBC/ODBC(jdbc 访问 hive):通过java代码访问hive,跟java访问mysql差不多
    WEBUI(浏览器访问 hive)
    2)元数据(Meta store):
    Hive中元数据用于存储映射关系;
    Hive中元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、 表的类型(是否是外部表)、表的数据所在目录等;
    Hive中元数据默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore
    3)Hadoop 使用 HDFS 进行存储,使用 MapReduce 进行计算。
    4)驱动器(Driver):
    (1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第 三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
    (2)编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
    (3)优化器(Query Optimizer):对逻辑执行计划进行优化。
    (4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来 说,就是 MR/Spark。

  • Hive的运行机制:Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver, 结合元数据(MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执行,最后,将 执行返回的结果输出到用户交互接口。
    在这里插入图片描述

1.3 Hive跟数据库比较

  • 查询语言:由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查 询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。
  • 数据更新:由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中 不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需 要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET 修 改数据。(实际上如果Hive要对数据进行更改,可以将数据下载下来进行更改再覆盖上传,但是当数据量大的时候速度将非常慢)
  • 执行延迟:Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导 致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此 在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。 当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候, Hive 的并行计算显然能体现出优势。
  • 数据规模:由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模 的数据;对应的,数据库可以支持的数据规模较小。

1.4 安装

1.4.1 hive安装

  1. 官网下载所需版本Downloads (apache.org),这里使用3.1.2版本apache-hive-3.1.2-bin.tar.gz

  2. 解压到linux环境中

  3. 配置环境变量

    vim /etc/profile.d/my_env.sh
    
    # 加入以下环境变量
    #HIVE_HOME
    export HIVE_HOME=/opt/module/hive
    export PATH=$PATH:$HIVE_HOME/bin
    
    # 配置完后需要source一下该文件以更新环境变量
    source /etc/profile.d/my_env.sh
    
  4. 解决日志 Jar 包冲突(可选)

    mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
    
  5. 初始化元数据库(用的是默认的derby数据库)

     bin/schematool -dbType derby -initSchema
    

1.4.2 hive启动

  1. 启动zookeeper

  2. 启动hadoop

  3. 启动hive

    bin/hive	
    
  4. hive默认的日志位置位置在/tmp/用户名/hive.log
    小技巧:当hive报错时,可以查看hive.log,使用tail -f命令追踪当前日志文件,输入很多空行再执行刚刚报错的程序,能够有效帮助定位到报错信息。

1.4.3 hive简单使用

  • # 显示目前所有的数据库
    show databases;
    # 显示目前所有表
    show tables;
    # 创建新表,创建的表默认存储在/user/hive/warehouse/下
    create table test(id string);
    # 向新表插入数据
    insert into test values('1001');
    # 查询表数据
    select * from test;
    
  • derby数据库的缺点:查看元数据不方便,只能在HDFS中查看,并且当同时启用两个客户端时会报错,所以我们需要将 Hive 的元数据地址改为 MySQL。

1.4.4 mysql安装

  1. 官网下载,这里使用版本为mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

  2. 检查当前系统是否安装过 MySQL(一般linux自带mysql)

    rpm -qa|grep mariadb
    //如果存在通过如下命令卸载
    sudo rpm -e --nodeps mariadb-libs
    
  3. 将 MySQL 安装包拷贝到/opt/software 目录下

  4. 解压 MySQL 安装包

    tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /opt/module/mysql
    
  5. 在安装目录下执行 rpm 安装,注意按照顺序安装

    sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
    sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
    sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
    sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
    sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
    
  6. 删除/etc/my.cnf 文件中 datadir 指向的目录下的所有内容

  7. 初始化数据库

    sudo mysqld --initialize --user=mysql
    
  8. 查看临时生成的 root 用户的密码

    sudo cat /var/log/mysqld.log 
    
    2022-07-27T06:38:14.218371Z 1 [Note] A temporary password is generated for root@localhost: WFd(?xG)L2W_
    
  9. 启动 MySQL 服务

    sudo systemctl start mysqld
    
  10. 登录 MySQL 数据库

    mysql -uroot -p
    
  11. 必须先修改 root 用户的密码,否则执行其他的操作会报错

    mysql>set password = password("root");
    
  12. 修改 mysql 库下的 user 表中的 root 用户允许任意 ip 连接

    mysql> update mysql.user set host='%' where user='root';
    mysql> flush privileges;
    

1.5 Hive相关配置

1.5.1 Hive元数据配置到mysql

  1. 将 MySQL 的 JDBC 驱动mysql-connector-java-5.1.27-bin.jar拷贝到 Hive 的 lib 目录下

    cp mysql-connector-java-5.1.27-bin.jar $HIVE_HOME/lib
    
  2. 配置 Metastore 到 MySQL
    1)在$HIVE_HOME/conf 目录下新建 hive-site.xml 文件,添加以下内容

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
         <!-- jdbc 连接的 URL -->
         <property>
         <name>javax.jdo.option.ConnectionURL</name>
         <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
    </property>
     <!-- jdbc 连接的 Driver-->
     <property>
         <name>javax.jdo.option.ConnectionDriverName</name>
         <value>com.mysql.jdbc.Driver</value>
    </property>
    <!-- jdbc 连接的 username-->
     <property>
         <name>javax.jdo.option.ConnectionUserName</name>
         <value>root</value>
     </property>
     <!-- jdbc 连接的 password -->
     <property>
         <name>javax.jdo.option.ConnectionPassword</name>
         <value>root</value>
    </property>
     <!-- Hive 元数据存储版本的验证,设置为false,因为默认使用的是derby数据库 -->
     <property>
         <name>hive.metastore.schema.verification</name>
         <value>false</value>
    </property>
     <!--元数据存储授权,设置为false,因为默认使用·的是derby数据库-->
     <property>
         <name>hive.metastore.event.db.notification.api.auth</name>
         <value>false</value>
     </property>
     <!-- Hive 默认在 HDFS 的工作目录 -->
     <property>
        <name>hive.metastore.warehouse.dir</name>
         <value>/user/hive/warehouse</value>
     </property>
    </configuration>
    

    2)登陆 MySQL

    mysql -uroot -proot
    

    3)新建 Hive 元数据库

    mysql> create database metastore;
    mysql> quit;
    

    4) 初始化 Hive 元数据库

    schematool -initSchema -dbType mysql -verbose
    

    5)启动hive,能够发现前面创建的test表已经没有了,但是重新创建tes表之后,能够发现test表中的数据还存在,这是因为mysql或derby数据库只是用来存储元数据,即存储表跟HDFS路径的映射,当重新创建出这个映射之后,就又能够读取到HDFS中对应路径的数据。
    6)通过navicat连接上mysql,查看metastore数据库,查看DBS表,表中只有一条信息,是hive中默认的数据库以及对应的HDFS路径
    在这里插入图片描述

    查看TBLS,能够查看hive数据库中的表,根据DBS和TBLS两个数据表,可以得到HDFS的对应路径。
    在这里插入图片描述

1.5.2 使用元数据服务的方式访问 Hive

  • 目前hive的使用方式只支持通过在hadoop102上进行访问,也就是只能本地进行连接,第三方无法跟hive进行交互,要使外部可以进行连接的话,需要启动一个元数据服务

  • 操作步骤
    (1)在 hive-site.xml 文件中添加如下配置信息,开放9083端口提供连接

    <!-- 指定存储元数据要连接的地址 -->
     <property>
         <name>hive.metastore.uris</name>
         <value>thrift://hadoop102:9083</value>
     </property>
    

    (2)启动元数据服务(配置了1之后若不启动元数据服务的话,则本地连接也不可用,配置了元数据服务之后,本地连接也是通过9083端口都元数据服务进行连接)(前台进程,启动后当前窗口不可用)

    hive --service metastore
    

1.5.3 使用JDBC方式访问hive

  • 除了通过元数据服务访问hive,还有一种通过jdbc的方式访问的hive。需要配置jdbc相关服务hiveserver2,通过hiveserver2去连接hive,需要启动元数据服务和hiveserver2两个服务,因为通过jdbc访问hive的方式是这样的:客户端通过hive的jdbc驱动访问到hiveserver2,hiveserver2内部会连接到元数据服务metastrore,metastore则通过mysql的jdbc驱动访问到mysql,获取存储在mysql中的元数据。

  • 操作步骤:
    (1)在 hive-site.xml 文件中添加如下配置信息

    <!-- 指定 hiveserver2 连接的 host -->
     <property>
         <name>hive.server2.thrift.bind.host</name>
        <value>hadoop102</value>
     </property>
     <!-- 指定 hiveserver2 连接的端口号 -->
     <property>
         <name>hive.server2.thrift.port</name>
         <value>10000</value>
     </property>
    

    (2)在hadoop的core-site.xml添加如下配置并重启hadoop(原因是hadoop引入了一个安全伪装机制,使得hadoop 不允许上层系统直接将实际用户传递到hadoop层,而是将实际用户传递给一个超级代理,由此代理在hadoop上执行操作,避免任意客户端随意操作hadoop,这里配置这两个参数使得当前用户能够访问到hadoop?)

    <!-- 配置超级用户F能够通过代理访问的主机节点 -->
    <property>
            <name>hadoop.proxyuser.F.hosts</name>
            <value>*</value>
    </property>
    <!-- 配置超级用户F允许代理的用户所属组 -->
    <property>
            <name>hadoop.proxyuser.F.groups</name>
            <value>*</value>
    </property>
    

    (3)启动hiveserver2(需要先启动元数据服务)(前台进程,启动后当前窗口不可用)(启动时间较长,内部有多次校验)

bin/hive --service hiveserver2


(4)通过hive自带的beeline客户端利用jdbc方式连接hive(如果通过其他工具进行连接的话,需要有hive的jdbc驱动,并提供下面的url和用户名即可)

```shell
bin/beeline -u jdbc:hive2://hadoop102:10000 -n F

1.5.4 元数据服务&hiveserver2脚本封装

  • 由于元数据服务和hiveserver2服务都是前台进程,直接启动不方便,需要将进程以后台方式启动

  • 后台方式启动知识:
    nohup: 放在命令开头,表示不挂起,也就是关闭终端进程也继续保持运行状态
    /dev/null:是 Linux 文件系统中的一个文件,被称为黑洞,所有写入改文件的内容 都会被自动丢弃
    2>&1 : 表示将错误重定向到标准输出上(0表示标准输入,1表示标准输出,2表示错误输出)
    &: 放在命令结尾,表示后台运行
    一般会组合使用: nohup [xxx 命令操作]> file 2>&1 &,表示将 xxx 命令运行的结 果输出到 file 中,并保持命令启动的进程在后台运行。

  • 脚本编写hiveservices.sh,并赋予权限

    #!/bin/bash
    #日志目录
    HIVE_LOG_DIR=$HIVE_HOME/logs 
    if [ ! -d $HIVE_LOG_DIR ] # -d表示判断当前路径是否存在并是否是文件夹
    then
    	mkdir -p $HIVE_LOG_DIR # 如果不存在则创建
    fi
    #检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口
    function check_process()
    {
         pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}') # 通过进程名$1来过滤进程,并得到进程号$2,其中grep -v grep为排除带grep的进程,awk用于根据空格进行切分得到的进程字符串
         ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1) # 通过端口号$2来过滤进程,并得到进程号&7,
         echo $pid
         [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1 # 如果通过以上两种方式得到的两个进程号一样则返回1,否则返回0
    }
    function hive_start()
    {
         metapid=$(check_process HiveMetastore 9083) # 检查元数据服务是否启动
         cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
         [ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动" # -z判断当前进程id长度是否为0,如果为0表明不存在,就执行&&后面的命令来启动元数据服务,eval表示所有参数解析完毕再执行命令,如果不为0就执行||后面的命令,输出元数据服务已启动
         server2pid=$(check_process HiveServer2 10000)
         cmd="nohup --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
         [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动"
    }
    function hive_stop()
    {
        metapid=$(check_process HiveMetastore 9083)
         [ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动" # 存在则杀死进程,否则提示元数据服务未启动
         server2pid=$(check_process HiveServer2 10000)
         [ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动"
    }
    case $1 in # 脚本后跟的第一个参数不同,对应调用的函数也不同
    "start")
         hive_start
         ;;
    "stop")
         hive_stop
         ;;
    "restart")
         hive_stop
         sleep 2
         hive_start
         ;;
    "status")
     check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行正常" || echo "Metastore 服务运行异常"
     check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2 服务运行异常"
     ;;
    *)
     echo Invalid Args! # 如果是没有定义的参数则提示参数错误
     echo 'Usage: '$(basename $0)' start|stop|restart|status'
     ;;
    esac
    
    
    chmod u+x hiveservices.sh
    

1.5.5 Hive其他配置

1)配置Hive运行日志存放位置

  • Hive 的 log 默认存放在/tmp/F/hive.log 目录下,在磁盘空间不足的时候会优先删除tmp目录下的文件,不安全

  • 修改 hive 的 log 存放日志到/opt/module/hive/logs
    (1)修改/opt/module/hive/conf/hive-log4j2.properties.template 文件名称为 hive-log4j2.properties
    (2)在 hive-log4j2.properties 文件中修改 log 存放位置

    property.hive.log.dir = /opt/module/hive/logs
    
  • 重启hive客户端后生效

2)配置hive在执行命令时会打印当前库和表头

  • 在hive-site.xml中加入如下配置:

    <property>
         <name>hive.cli.print.header</name>
         <value>true</value>
    </property>
     <property>
         <name>hive.cli.print.current.db</name>
         <value>true</value>
     </property>
    
  • 重启hive客户端后生效

3)hive的一些其他参数可以在hive-default.xml.template下查看
4)查看所有的配置信息

hive>set;

5)参数的配置三种方式

  • 配置文件方式:在hive-site.xml中中配置参数,用户自定义配置会覆盖默认配置。另外,Hive 也会读入 Hadoop 的配置,因为 Hive 是作为 Hadoop 的客户端启动的,Hive 的配置会覆盖 Hadoop 的配置。配置文件的设定对本 机启动的所有 Hive 进程都有效。

  • 命令行参数方式:启动 Hive 时,可以在命令行添加-hiveconf param=value 来设定参数。例如

     bin/hive -hiveconf mapred.reduce.tasks=10;
    

    在hive客户端中可以查看参数的设置

    hive (default)> set mapred.reduce.tasks;
    

    注意:以上操作仅对本次 hive 启动有效。
    利用-e参数可以不进入hive客户端执行一些命令,可以利用这个机制,来针对某个语句设置参数;

    # 本次参数设置只对后面的select语句生效
    bin/hive -e "set param=value; select * from test;"
    
  • 参数声明方式

    # 可以在 HQL 中使用 SET 关键字设定参数
    hive (default)> set mapred.reduce.tasks=5;
    
  • 三种设置方式的优先级依次递增。即配置文件<命令行参数<参数声明。

1.6 hive常用命令

  • 通过hive目录下的bin/hive -help命令可以查看hive的一些交互命令

    bin/hive -help
    which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/ha/hadoop-3.1.3/bin:/opt/ha/hadoop-3.1.3/sbin:/opt/module/hive/bin:/home/F/.local/bin:/home/F/bin)
    Hive Session ID = bd6c34c8-5407-4948-98ac-2b06f06de9c3
    usage: hive
     -d,--define <key=value>          Variable substitution to apply to Hive
                                      commands. e.g. -d A=B or --define A=B
        --database <databasename>     Specify the database to use
     -e <quoted-query-string>         SQL from command line
     -f <filename>                    SQL from files
     -H,--help                        Print help information
        --hiveconf <property=value>   Use value for given property
        --hivevar <key=value>         Variable substitution to apply to Hive
                                      commands. e.g. --hivevar A=B
     -i <filename>                    Initialization SQL file
     -S,--silent                      Silent mode in interactive shell
     -v,--verbose                     Verbose mode (echo executed SQL to the
                                      console)
    
  • 常用交互命令

    # “-e”不进入 hive 的交互窗口执行 sql 语句, 有该命令可以通过脚本来执行hive语句
    bin/hive -e "select id from student;"
    # “-f”执行脚本中 sql 语句,脚本后缀不重要
    bin/hive -f /opt/module/hive/datas/hivef.sql
    #  执行文件中的 sql 语句并将结果写入文件中
    bin/hive -f /opt/module/hive/datas/hivef.sql > /opt/module/datas/hive_result.txt
    
  • 其他命令

    # 在 hive命令窗口中如何查看 hdfs 文件系统
    dfs -ls /;
    # 查看在 hive 中输入的所有历史命令
    (1)进入到当前用户的根目录 /root 或/home/atguigu
    (2)查看. hivehistory 文件
    cat .hivehistory
    

2 Hive数据类型

2.1 基本数据类型

  • 在这里插入图片描述

  • 对于 Hive 的 String 类型相当于数据库的 varchar 类型,该类型是一个可变的字符串,不 过它不能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。

2.2 集合数据类型

  • 在这里插入图片描述

  • Hive 有三种复杂数据类型 ARRAY、MAP 和 STRUCT。ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似,而 STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据 类型允许任意层次的嵌套。

  • 案例实操:
    在hive中创建新表test2

    create table test(
    name string,
    friends array<string>,
    children map<string, int>,
    address struct<street:string, city:string>
    )
    row format delimited fields terminated by ',' # 定义列分隔符为,
    collection items terminated by '_' # 定义集合数据分隔符为_
    map keys terminated by ':' # 定义map中key和value的分隔符为:
    lines terminated by '\n'; # 定义行分隔符为\n
    

    准备测试数据test.txt

    songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
    yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
    

    上传test.txt到HDFS路径下的/user/hive/warehouse/test2,hive中查询test2的数据
    在这里插入图片描述

    # 查询array类型字段中的第一个数据
    select friends[0] from test2 where name='songsong';
    # 获取map类型字段中某一个key下对应的value
    select children['xiao song'] from test2 where name='songsong';
    # 获取struct类型字段中的某一个成员变量
    select address.street from test2 where name='songsong';
    

2.3 类型转换

  • Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换,例如某表达式 使用 INT 类型,TINYINT 会自动转换为 INT 类型,但是 Hive 不会进行反向转化,例如,某表 达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使用 CAST 操作。
    1)隐式类型转换规则如下
    (1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成 INT,INT 可以转换成 BIGINT。
    (2)所有整数类型、FLOAT 和 STRING 类型(STRING类型的内容必须是数字)都可以隐式地转换成 DOUBLE。
    (3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。
    (4)BOOLEAN 类型不可以转换为任何其它的类型。
    2)可以使用 CAST 操作显示进行数据类型转换:例如 CAST(‘1’ AS INT)将把字符串’1’ 转换成整数 1;如果强制类型转换失败,如执行 CAST(‘X’ AS INT),表达式返回空值 NULL。

3 Hive-DDL数据定义(增删改查数据库)

3.1 创建数据库

  • 创建数据库命令

    # []代表可选项
    # IF NOT EXISTS不存在时才创建
    # COMMENT database_comment指定数据库注释
    # LOCATION hdfs_path指定数据库存放位置,默认是hdfs下的/user/hive/warehouse/数据库名.db
    # WITH DBPROPERTIES (property_name=property_value, ...)额外参数信息,如作者信息,创建时间等
    CREATE DATABASE [IF NOT EXISTS] database_name
    [COMMENT database_comment]
    [LOCATION hdfs_path]
    [WITH DBPROPERTIES (property_name=property_value, ...)];
    
  • 示例

    create database if not exists hive;
    create database hive location 'hive';
    

3.2 查询数据库

  • 常用命令

    # 显示数据库
    show databases;
    # 过滤显示查询的数据库
    show databases like 'db_hive*'
    # 显示数据库信息
    desc database db_hive;
    # 显示数据库详细信息,extended,可以查看一些扩展信息DBPROPERTIES
    desc database extended db_hive;
    # 切换数据库
    use db_hive;
    

3.3 修改数据库

  • 用户可以使用 ALTER DATABASE 命令为某个数据库的 DBPROPERTIES 设置键-值对属性值, 来描述这个数据库的属性信息。

    alter database db_hive set dbproperties('createtime'='20170830');
    
  • 修改只能修改DBPROPERTIES这种扩展信息,查看扩展信息的修改情况通过extended参数去查看

3.4 删除数据库

  • 常用命令

    # 删除非空数据库
    drop database db_hive2;
    # 如果删除的数据库不存在,最好采用 if exists 判断数据库是否存在
    drop database if exists db_hive2;
    # 如果数据库不为空,上面的命令删除不了,可以采用 cascade 命令,强制删除
    drop database db_hive cascade;
    

3.5 创建表

  • 建表语法

    # [EXTERNAL]:创建外部表,HIVE中表有内外之分
    # [IF NOT EXISTS]:不存在才创建
    # [(col_name data_type [COMMENT col_comment], ...)]:列名,列类型,列注释
    # [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]:设置按什么字段分桶,分几个桶
    # [ROW FORMAT row_format]:定义行格式的限制
    # [STORED AS file_format]:指定文件格式
    #  [LOCATION hdfs_path]:指定表的存储位置
    # [TBLPROPERTIES (property_name=property_value, ...)]:表的额外属性
    # [AS select_statement]:根据查询语句建表
    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
    [(col_name data_type [COMMENT col_comment], 
    上一篇:电脑软件:推荐一款免费且实用的电脑开关机小工具-四、使用说明


    下一篇:商务英语学习柯桥学外语到泓畅-老外说“go easy on me”是什么意思?