Hadoop-Hive

本文详细介绍了Hive 3.1.2版本,包括Hive的基本概念、架构、安装步骤、交互方式、元数据、基本操作、数据类型、表操作、内外部表、数据导入导出、分区表、自定义函数、经典案例以及Hive参数设置。Hive作为Hadoop的数据仓库工具,提供SQL查询功能,简化大数据处理,适用于日志分析和多维度数据分析。文章通过丰富的例子和操作步骤,阐述了Hive在数据处理中的应用及其优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hive 3.1.2

在这里插入图片描述
Hive是基于 Hadoop 的一个【数据仓库工具】,可以将结构化和半结构化的数据文件映射为一张数据库
表,并提供简单的 sql 查询功能

1. Hive的基本概念

1.1. Hive简介

在这里插入图片描述
Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以
理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步可以说hive就是一个MapReduce客
户端
思考:计算文件user.txt中张三出现几次,使用mapreduce怎么写,然后再比照下图的hive的实现过程
在这里插入图片描述

  • 为什么使用Hive
    • 直接不使用hadoop
      1)人员学习成本太高
      2)项目要求周期太短
      3)MapReduce实现复杂查询逻辑开发难度太大
    • 为什么要使用Hive
      1)操作接口采用类SQL语法,提供快速开发能力
      2)免去了写MapReduce,减少开发人员学历成本
      3)功能扩展很方便
  • Hive的特点
    • 可扩展性
      Hive可以自由的扩展集群的规模,一般情况下不需要重启服务
    • 延伸性
      Hive支持自定义函数,用户可以根据自己的需要来实现自己的函数
    • 容错
      即使节点出现错误,SQL仍然可以完成执行
  • Hive优缺点
    • 优点
    1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
    2. 避免了去写MapReduce,减少开发人员的学习成本。
    3. Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
    4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
    5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
    6. 集群可自由拓展并且具有良好的容错性,节点出现问题SQL仍可完成执行。
    • 缺点
    1. Hive的HQL表达能力有限
      (1)迭代式算法无法表达
      (2)数据挖掘方面不擅长
    2. Hive的效率比较低
      (1)Hive自动生成的MapReduce作业,通常情况下不够智能化
      (2)Hive调优比较困难,粒度较粗
  • Hive和传统数据库对比

在这里插入图片描述

  • Hive应用场景
    • 日志分析:大部分互联网公司使用hive进行日志分析,包括百度、淘宝等。
      统计网站一个时间段内的pv、uv
      多维度数据分析
    • 海量结构化数据离线分析

1.2. Hive架构

在这里插入图片描述

1.2.1. Client

Hive允许client连接的方式有三个CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问
hive)。JDBC访问时中间件Thrift软件框架,跨语言服务开发。DDL DQL DML,整体仿写一套SQL语句。

  • client–需要下载安装包
  • JDBC/ODBC 也可以连接到Hive
    • 现在主流都在倡导第二种 HiveServer2/beeline
    • 做基于用户名和密码安全的一个校验
  • Web Gui
    • hive给我们提供了一套简单的web页面
    • 我们可以通过这套web页面访问hive
    • 做的太简陋了
1.2.2. Metastore

元数据包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是
外部表)、表的数据所在目录等。

  • 一般需要借助于其他的数据载体(数据库)
  • 主要用于存放数据库的建表语句等信息
  • 推荐使用Mysql数据库存放数据
  • 连接数据库需要提供:uri username password driver
1.2.3. Driver

元数据存储在数据库中,默认存在自带的derby数据库(单用户局限性)中,推荐使用Mysql进行存储。
(1) 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完
成,比如ANTLR;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2) 编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3) 优化器(Query Optimizer):对逻辑执行计划进行优化。
(4) 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是
MR/Spark。

1.2.4. 数据处理

Hive的数据存储在HDFS中,计算由MapReduce完成。HDFS和MapReduce是源码级别上的整合,两者
结合最佳。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计
划的生成。

1.3. Hive的安装

节点\功能 metastore hiveserver2 client
node01 * *
node02 *
node03 *

PS: 安装前 请确认当前集群已经安装了Mysql数据库和Hadoop的Ha+Yarn

1.3.1. 下载上传解压
[root@node01 ~]# tar -zxvf apache-hive-3.1.2-bin.tar.gz
[root@node01 ~]#
[root@node01 ~]# cd /opt/apache-hive-3.1.2-bin/conf
1.3.2. 修改配置文件
  • 配置hive-env.sh
    [root@node01 conf]# cp hive-env.sh.template hive-env.sh
    [root@node01 conf]# vi hive-env.sh
HADOOP_HOME=/opt/hadoop-3.1.2/
export HIVE_CONF_DIR=/opt/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/opt/apache-hive-3.1.2-bin/lib
  • 创建hive-site.xml
    [root@node01 conf]# cp hive-default.xml.template hive-site.xml
    [root@node01 conf]# vi hive-site.xml
    删除多余的配置文件 6897dd
<!-- 数据库相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01:3306/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>123456</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- 美化打印数据 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- hive server -->
<property>
<name>hive.server2.webui.host</name>
<value>node01</value>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<!-- 数据存储位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
  • 修改core-site.xml
    [root@node01 conf]# vi /opt/hadoop-3.1.2/etc/hadoop/core-site.xml

后面添加配置信息

<!--该参数表示可以通过httpfs接口hdfs的ip地址限制-->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!--通过httpfs接口访问的用户获得的群组身份-->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
1.3.3. 配置日志组件
  • 创建文件目录
    [root@node01 ~]# mkdir -p /opt/apache-hive-3.1.2-bin/logs
    [root@node01 conf]# cp hive-log4j2.properties.template hive-log4j2.properties
    [root@node01 conf]# vi hive-log4j2.properties
property.hive.log.dir = /opt/apache-hive-3.1.2-bin/logs
1.3.4. 添加驱动包
  • Mysql驱动添加到hive的lib目录下
    [root@node01 ~]# cp ~/mysql-connector-java-5.1.32-bin.jar /opt/apache-hive-3.1.2-bin/lib/
  • Guava包
    • 首先要删除hadoop中的guava-*.jar包
[root@node01 ~]# rm -rf /opt/hadoop3.1.2/share/hadoop/common/lib/guava-*.jar
[root@node01 ~]# rm -rf /opt/hadoop3.1.2/share/hadoop/hdfs/lib/guava-*.jar
- 将Hive的Guava拷贝给Hive
[root@node01 ~]# cp /opt/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/hadoop-3.1.2/share/hadoop/common/lib/
[root@node01 ~]# cp /opt/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/
1.3.5. 配置环境变量

vi /etc/profile

export HIVE_HOME=/opt/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH

source /etc/profile

1.3.6. 拷贝到其他节点
  • hive文件夹
[root@node02 ~]# scp -r root@node01:/opt/apache-hive-3.1.2-bin /opt/
[root@node03 ~]# scp -r root@node01:/opt/apache-hive-3.1.2-bin /opt/
  • 环境变量
[root@node01 ~]# scp /etc/profile root@node02:/etc/profile
[root@node01 ~]# scp /etc/profile root@node03:/etc/profile

【123】source /etc/profile

  • core-stie.xml
[root@node01 ~]# scp /opt/hadoop-3.1.2/etc/hadoop/core-site.xml root@node02:/opt/hadoop-3.1.2/etc/hadoop/
[root@node01 ~]# scp /opt/hadoop-3.1.2/etc/hadoop/core-site.xml root@node03:/opt/hadoop-3.1.2/etc/hadoop/
  • jar包
[root@node02 ~]# rm -rf /opt/hadoop3.1.2/share/hadoop/common/lib/guava-*.jar
[root@node02 ~]# rm -rf /opt/hadoop3.1.2/share/hadoop/hdfs/lib/guava-*.jar
[root@node03 ~]# rm -rf /opt/hadoop3.1.2/share/hadoop/common/lib/guava-*.jar
[root@node03 ~]# rm -rf /opt/hadoop3.1.2/share/hadoop/hdfs/lib/guava-*.jar
[root@node02 ~]# cp /opt/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/hadoop-3.1.2/share/hadoop/common/lib/
[root@node02 ~]# cp /opt/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/
[root@node03 ~]# cp /opt/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/hadoop-3.1.2/share/hadoop/common/lib/
[root@node03 ~]# cp /opt/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/
1.3.7. 客户端配置文件
  • 选取node03为客户端节点
    【23】 vi /opt/apache-hive-3.1.2-bin/conf/hive-site.xml
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<!--指定hive.metastore.uris的port.为了启动metastore服务的时候不用指定端口-->
<!--hive ==service metastore -p 9083 & | hive ==service metastore-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node01:9083</value>
</property>
1.3.8. 启动集群
  • 启动Zookeeper
    • 【123】zkServer.sh start
  • 启动Hdfs+Yarn
    • [root@node01 ~]# start-all.sh
  • 初始化数据库
    • [root@node01 ~]# schematool -dbType mysql -initSchema
    • 在这里插入图片描述
  • 启动Hive
    • [root@node01 ~]# hive --service metastore
    • [root@node01 ~]# nohup hive --service metastore > /dev/null 2>&1 &
    • [root@node03 ~]# hive
  • 启动HiveServer2
    • [root@node01 ~]# hiveserver2
    • [root@node01 ~]# nohup hiveserver2 > /dev/null 2>&1 &
    • [root@node03 ~]# beeline -u jdbc:hive2://node01:10000 -n root

1.4. Hive的三种交互方式

1)第一种交互方式
shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。

服务端启动metastore服务:nohup hive --service metastore > /dev/null 2>&1 &
进入命令:hive
退出命令行:quit;

2)第二种交互方式
Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器,来完成访问
操作,这是生产环境用法最多的

hadoop fs -chmod -R 777 /opt
服务端启动hiveserver2服务:nohup hiveserver2 > /dev/null 2>&1 &
需要稍等一下,启动服务需要时间:
进入命令:1)先执行beeline,在执行! connect jdbc:hive2://node01:10000
2)或者直接执行 beeline -u jdbc:hive2://node01:10000 -n root
退出命令行:!exit

3)第三种交互方式

  • 使用 –e 参数来直接执行hql的语句
bin/hive -e "show databases;"
  • 使用 –f 参数通过指定文本文件来执行hql的语句
vi hive.sql
use myhive;
select * from test;

保存退出

hive -f hive.sql

特点:执行完sql后,回到linux命令行。
4)在hive cli和beeline cli的区别
在这里插入图片描述

  • metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive元数据,并且通过thrift获
    取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。
    HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。一般
    来讲,我们认为HiveServer2是用来提交查询的,也就是用来访问数据的。 而MetaStore才是用来
    访问元数据的。
  • beeline cli优化了命令行界面

1.5. Hive元数据

Hive元数据库中一些重要的表结构及用途,方便Impala、SparkSQL、Hive等组件访问元数据库的理
解。
1、存储Hive版本的元数据表(VERSION)
该表比较简单,但很重要。

VER_ID SCHEMA_VERSION VERSION_COMMENT
ID主键 Hive版本 版本说明
1 1.1.0 Set by MetaStore

如果该表出现问题,根本进入不了Hive-Cli。比如该表不存在,当启动Hive-Cli时候,就会报错”Table
‘hive.version’ doesn’t exist”。

2、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)
DBS:该表存储Hive中所有数据库的基本信息,字段如下:

表字段 说明 示例数据
DB_ID 数据库ID 1
DESC 数据库描述 Default Hive database
DB_LOCATION_URI 数据HDFS路径 hdfs://193.168.1.75:9000/test-warehouse
NAME 数据库名 default
OWNER_NAME 数据库所有者用户名 public
OWNER_TYPE 所有者角色 ROLE

DATABASE_PARAMS:该表存储数据库的相关参数,在CREATE DATABASE时候用WITH
DBPROPERTIES(property_name=property_value, …)指定的参数。

表字段 说明 示例数据
DB_ID 数据库ID 1
PARAM_KEY 参数名 createdby
PARAM_VALUE 参数值 root

DBS和DATABASE_PARAMS这两张表通过DB_ID字段关联。

3、Hive表和视图相关的元数据表
主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。
TBLS:该表中存储Hive表,视图,索引表的基本信息

表字段 说明 示例数据
TBL_ID 表ID 21
CREATE_TIME 创建时间 1447675704
DB_ID 数据库ID 1
LAST_ACCESS_TIME 上次访问时间 1447675704
OWNER 所有者 root
RETENTION 保留字段 0
SD_ID 序列化配置信息 41,对应SDS表中的SD_ID
TBL_NAME 表名 ex_detail_ufdr_30streaming
TBL_TYPE 表类型 EXTERNAL_TABLE
VIEW_EXPANDED_TEXT 视图的详细HQL语句
VIEW_ORIGINAL_TEXT 视图的原始HQL语句

TABLE_PARAMS:该表存储表/视图的属性信息

表字段 说明 示例数据
TBL_ID 表ID 1
PARAM_KEY 属性名 totalSize,numRows,EXTERNAL
PARAM_VALUE 属性值 970107336、21231028、TRUE

TBL_PRIVS:该表存储表/视图的授权信息

表字段 说明 示例数据
TBL_GRANT_ID 授权ID 1
CREATE_TIME 授权时间 1436320455
GRANT_OPTION 0
GRANTOR 授权执行用户 root
GRANTOR_TYPE 授权者类型 USER
PRINCIPAL_NAME 被授权用户 username
PRINCIPAL_TYPE 被授权用户类型 USER
TBL_PRIV 权限 Select、Alter
TBL_ID 表ID 21, 对应TBLS表的TBL_ID

4、Hive文件存储信息相关的元数据表
主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS,由于HDFS支持的文件格式很多,而建Hive
表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格
式去读写HDFS文件,而这些信息就保存在这几张表中。
SDS:
该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。TBLS表中的
SD_ID与该表关联,可以获取Hive表的存储信息。

表字段 说明 示例数据
SD_ID 存储信息ID 41
CD_ID 字段信息ID 21,对应CDS表
INPUT_FORMAT 文件输入格式 org.apache.hadoop.mapred.TextInputFormat
IS_COMPRESSED 是否压缩 0
IS_STOREDASSUBDIRECTORIES 是否以子目录存储 0
LOCATION HDFS路径 hdfs://193.168.1.75:9000/detail_ufdr_streaming_test
NUM_BUCKETS 分桶数量 0
OUTPUT_FORMAT 文件输出格式 org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
SERDE_ID 序列化类ID 41,对应SERDES表

SD_PARAMS: 该表存储Hive存储的属性信息,在创建表时候使用STORED BY
‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)指定。

表字段 说明 示例数据
SD_ID 存储配置ID 41
PARAM_KEY 存储属性名
PARAM_VALUE 存储属性值

SERDES:该表存储序列化使用的类信息

表字段 说明 示例数据
SERDE_ID 序列化类配置ID 41
NAME 序列化类别名 NULL
SLIB 序列化类 org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符

表字段 说明 示例数据
SERDE_ID 序列化类配置ID 41
PARAM_KEY 属性名 field.delim
PARAM_VALUE 属性值

5、Hive表字段相关的元数据表
主要涉及COLUMNS_V2
COLUMNS_V2:该表存储表对应的字段信息

表字段 说明 示例数据
CD_ID 字段信息ID 21
COMMENT 字段注释 NULL
COLUMN_NAME 字段名 air_port_duration
TYPE_NAME 字段类型 bigint
INTEGER_IDX 字段顺序 119

6、Hive表分分区相关的元数据表
主要涉及PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS
PARTITIONS:该表存储表分区的基本信息

表字段 说明 示例数据
PART_ID 分区ID 21
CREATE_TIME 分区创建时间 1450861405
LAST_ACCESS_TIME 最后一次访问时间 0
PART_NAME 分区名 hour=15/last_msisdn=0
SD_ID 分区存储ID 43
TBL_ID 表ID 22
LINK_TARGET_ID NULL

PARTITION_KEYS:该表存储分区的字段信息

表字段 说明 示例数据
TBL_ID 表ID 22
PKEY_COMMENT 分区字段说明 NULL
PKEY_NAME 分区字段名 hour
PKEY_TYPE 分区字段类型 int
INTEGER_IDX 分区字段顺序 0

PARTITION_KEY_VALS:该表存储分区字段值

表字段 说明 示例数据
PART_ID 分区ID 21
PART_KEY_VAL 分区字段值 0
INTEGER_IDX 分区字段值顺序 1

PARTITION_PARAMS:该表存储分区的属性信息

表字段 说明 示例数据
PART_ID 分区ID 21
PARAM_KEY 分区属性名 numFiles,numRows
PARAM_VALUE 分区属性值 1,502195

7、其他不常用的元数据表
DB_PRIVS:数据库权限信息表。通过GRANT语句对数据库授权后,将会在这里存储。
IDXS:索引表,存储Hive索引相关的元数据
INDEX_PARAMS:索引相关的属性信息
TBL_COL_STATS:表字段的统计信息。使用ANALYZE语句对表字段分析后记录在这里
TBL_COL_PRIVS:表字段的授权信息
PART_PRIVS:分区的授权信息
PART_COL_PRIVS:分区字段的权限信息
PART_COL_STATS:分区字段的统计信息
FUNCS:用户注册的函数信息
FUNC_RU:用户注册函数的资源信息

2. Hive的基本操作

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [column_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, ...)
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 (...)]
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
data_type
: primitive_type
| array_type
| map_type
| struct_type
| union_type
primitive_type
: TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| DOUBLE PRECISION
| STRING
| BINARY
| TIMESTAMP
| DECIMAL
| DECIMAL(precision, scale)
| DATE
| VARCHAR
| CHAR
array_type
: ARRAY < data_type >
map_type
: MAP < primitive_type, data_type >
struct_type
: STRUCT < col_name : data_type [COMMENT col_comment], ...>
union_type
: UNIONTYPE < data_type, data_type, ... >
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS
TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value, ...)]
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| JSONFILE -- (Note: Available in Hive 4.0.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
column_constraint_specification:
: [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK
[check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
default_value:
: [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ]
constraint_specification:
: [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
[, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
[, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES
table_name(col_name, ...) DISABLE NOVALIDATE
[, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE
RELY/NORELY ]
[, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE
NOVALIDATE RELY/NORELY ]

2.1. Hive库操作

2.1.1. 创建数据库

1)创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/*.db。

create database shop;

2)避免要创建的数据库已经存在错误,增加if not exists判断。(标准写法)

create database if not exists shop;
2.1.2. 创建数据库和位置
create database if not exists school location '/school.db';
2.1.3. 修改数据库

户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据
库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。

alter database school set dbproperties('createtime'='20201213');
2.1.4. 数据库详细信息

1)显示数据库(show)

show databases;

2)可以通过like进行过滤

show databases like 's*';
  1. 查看详情(desc)
desc database school;

4)切换数据库(use)

use school;
2.1.5. 删除数据库

1)最简写法

drop database school;

2)如果删除的数据库不存在,最好使用if exists判断数据库是否存在。否则会报错:FAILED:
SemanticException [Error 10072]: Database does not exist: db_hive

drop database if exists school;

3)如果数据库不为空,使用cascade命令进行强制删除。报错信息如下FAILED: Execution Error, return
code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)

drop database if exists school cascade;

2.2. Hive数据类型

2.2.1. 基础数据类型
类型 Java数据类型 描述
TINYINT byte 8位有符号整型。取值范围:-128~127。
SMALLINT short 16位有符号整型。取值范围:-32768~32767。
INT int 32位有符号整型。取值范围:-2 31 ~2 31 -1。
BIGINT long 64位有符号整型。取值范围:-2 63 +1~2 63 -1。
BINARY 二进制数据类型,目前长度限制为8MB。
FLOAT float 32位二进制浮点型。
DOUBLE double 64位二进制浮点型。
DECIMAL(precision,scale) 10进制精确数字类型。precision:表示最多可以表示多少位的数字。取值范围: 1 <= precision <=38 。scale:表示小数部分的位数。取值范围: 0 <=scale <= 38 。如果不指定以上两个参数,则默认为decimal(10,0) 。
VARCHAR(n) 变长字符类型,n为长度。取值范围:1~65535。
CHAR(n) 固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。
STRING string 字符串类型,目前长度限制为8MB。
DATE 日期类型,格式为 yyyy-mm-dd 。取值范围:0000-01-01~9999-12-31。
DATETIME 日期时间类型。取值范围:0000-01-0100:00:00.000~9999-12-31 23.59:59.999,精确到毫秒。
TIMESTAMP 与时区无关的时间戳类型。取值范围:0000-01-0100:00:00.000000000~9999-12-3123.59:59.999999999,精确到纳秒。说明 对于部分时区相关的函数,例如 cast( asstring) ,要求TIMESTAMP按照与当前时区相符的方式来展现。
BOOLEAN boolean BOOLEAN类型。取值:True、False。
2.2.2. 复杂数据类型
类型 定义方法 构造方法
ARRAY array``array<struct<a:int,b:string>> array(1, 2, 3)``array(array(1,2), array(3, 4))
MAP map<string,string>``map<smallint,array> map(“k1”, “v1”, “k2”,“v2”)``map(1S, array(‘a’, ‘b’),2S, array(‘x’, ‘y’))
STRUCT struct<x:int,y:int>``struct<field1:bigint,field2:array,field3:map<int, int>> named_struct(‘x’, 1, ‘y’,2)``named_struct(‘field1’, 100L,‘field2’, array(1, 2), ‘field3’,map(1, 100, 2, 200))

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

2.3. Hive表操作

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [column_specification] [COMMENT col_comment], ...
[constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

♪-Interpretation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值