Hive环境搭建和基础使用

大数据-HIVE

Hive简介

Hive 是一个基于 Hadoop 的数据仓库工具,适用于需要处理大规模数据和进行数据分析的场景。

1、hive产生的原因

​ 1.1、方便对文件及数据的元数据进行管理,提供统一的元数据管理方式

​ 1.2、 提供更加简单的方式来访问大规模的数据集,使用SQL语言进行数据分析

2、Hive主要应用场景

2.1、数据仓库

Hive 可以将 Hadoop 集群中的数据转换为 SQL 形式,使得用户可以通过 SQL 查询语言来查询 Hadoop 集群中的数据,从而实现数据仓库的功能。

2.2、数据分析

Hive 可以提供 SQL 接口,使得用户可以使用 SQL 查询语言来对 Hadoop 集群中的数据进行分析和处理。用户可以通过 HiveQL 语句进行数据查询、聚合、过滤等操作。

2.3、日志处理

Hive 可以处理大规模的日志数据,例如 Web 日志、应用程序日志等。通过将日志数据存储到 Hadoop 集群中,然后使用 HiveQL 进行查询和分析,可以快速了解用户行为、应用程序运行情况等信息。

2.4、商业智能

Hive 可以与商业智能工具(例如 Tableau、Power BI 等)集成,用于生成数据报表、数据可视化等功能。通过 HiveQL 和商业智能工具,用户可以快速了解业务数据和趋势,从而支持决策和管理。

2.5、数据挖掘

Hive 可以与机器学习工具(例如 Apache Mahout、Weka 等)集成,用于进行数据挖掘和机器学习分析。通过 HiveQL 和机器学习工具,用户可以快速对大规模数据进行分析和挖掘,发现数据中的模式和趋势。

2.6、海量存储

Hive 可以将数据存储到 Hadoop 集群中,从而支持海量存储和处理。通过 Hadoop 的分布式存储和计算能力,Hive 可以处理大规模数据,并支持数据的高可靠性和可扩展性。

3、hive是什么?

The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.

​ Hive经常被大数据企业用作企业级数据仓库。

​ Hive在使用过程中是使用SQL语句来进行数据分析,由SQL语句到具体的任务执行还需要经过解释器,编译器,优化器,执行器四部分才能完成。

​ (1)解释器:调用语法解释器和语义分析器将SQL语句转换成对应的可执行的java代码或者业务代码

​ (2)编译器:将对应的java代码转换成字节码文件或者jar包

​ (3)优化器:从SQL语句到java代码的解析转化过程中需要调用优化器,进行相关策略的优化,实现最优的 查询性能

​ (4)执行器:当业务代码转换完成之后,需要上传到MapReduce的集群中执行

4、数据仓库–Hive(简单了解即可)

4.1、数据仓库基本概念

​ 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

4.2、数据处理分类:OLAP与OLTP

​ 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

4.3、OLTP

​ OLTP,也叫联机事务处理(Online Transaction Processing),表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的Transaction以及Execute SQL的数量。在这样的系统中,单个数据库每秒处理的Transaction往往超过几百个,或者是几千个,Select 语句的执行量每秒几千甚至几万个。典型的OLTP系统有电子商务系统、银行、证券等,如美国eBay的业务数据库,就是很典型的OLTP数据库。

4.4、OLAP

​ OLAP(On-Line Analysis Processing)在线分析处理是一种共享多维信息的快速分析技术;OLAP利用多维数据库技术使用户从不同角度观察数据;OLAP用于支持复杂的分析操作,侧重于对管理人员的决策支持,可以满足分析人员快速、灵活地进行大数据复量的复杂查询的要求,并且以一种直观、易懂的形式呈现查询结果,辅助决策。

基本概念:

​ 度量:数据度量的指标,数据的实际含义
​ 维度:描述与业务主题相关的一组属性
​ 事实:不同维度在某一取值下的度量

特点:

​ (1)快速性:用户对OLAP的快速反应能力有很高的要求。系统应能在5秒内对用户的大部分分析要求做出反 应。
​ (2)可分析性:OLAP系统应能处理与应用有关的任何逻辑分析和统计分析。

​ (3)多维性:多维性是OLAP的关键属性。系统必须提供对数据的多维视图和分析,包括对层次维和多重层次维的完全支持。
​ (4)信息性:不论数据量有多大,也不管数据存储在何处,OLAP系统应能及时获得信息,并且管理大容量信 息。

分类:

​ 按照存储方式分类:

​ ROLAP:关系型在线分析处理

​ MOLAP:多维在线分析处理

​ HOLAP:混合型在线分析处理

​ 按照处理方式分类:

​ Server OLAP和Client OLAP

操作:

在这里插入图片描述

​ 钻取:在维的不同层次间的变化,从上层降到下一层,或者说将汇总数据拆分到更细节的数据,比如通过 对2019年第二季度的总销售数据进行钻取来查看2019年4,5,6,每个月的消费数据,再例如可以钻取 浙江省来查看杭州市、温州市、宁波市…这些城市的销售数据
​ 上卷:钻取的逆操作,即从细粒度数据向更高汇总层的聚合,如将江苏省、上海市、浙江省的销售数据进 行汇总来查看江浙沪地区的销售数据
​ 切片:选择维中特定的值进行分析,比如只选择电子产品的销售数据或者2019年第二季度的数据
​ 切块:选择维中特定区间的数据或者某批特定值进行分析,比如选择2019年第一季度到第二季度的销售数 据或者是电子产品和日用品的销售数据
​ 旋转:维的位置互换,就像是二维表的行列转换,比如通过旋转来实现产品维和地域维的互换

5、数据库与数据仓库的区别

注意:前三条重点掌握理解,后面的了解即可

​ 1、数据库是对业务系统的支撑,性能要求高,相应的时间短,而数据仓库则对响应时间没有太多的要求,当然也是越快越好

​ 2、数据库存储的是某一个产品线或者某个业务线的数据,数据仓库可以将多个数据源的数据经过统一的规则清洗之后进行集中统一管理

​ 3、数据库中存储的数据可以修改,无法保存各个历史时刻的数据,数据仓库可以保存各个时间点的数据,形成时间拉链表,可以对各个历史时刻的数据做分析

​ 4、数据库一次操作的数据量小,数据仓库操作的数据量大

​ 5、数据库使用的是实体-关系(E-R)模型,数据仓库使用的是星型模型或者雪花模型

​ 6、数据库是面向事务级别的操作,数据仓库是面向分析的操作

Hive的架构

1、Hive的架构图

在这里插入图片描述

2、Hive的服务(角色)

1、用户访问接口

​ CLI(Command Line Interface):用户可以使用Hive自带的命令行接口执行Hive QL、设置参数等功能

​ JDBC/ODBC:用户可以使用JDBC或者ODBC的方式在代码中操作Hive

​ Web GUI:浏览器接口,用户可以在浏览器中对Hive进行操作(2.2之后淘汰)

2、Thrift Server:

​ Thrift服务运行客户端使用Java、C++、Ruby等多种语言,通过编程的方式远程访问Hive

3、Driver

​ Hive Driver是Hive的核心,其中包含解释器、编译器、优化器等各个组件,完成从SQL语句到MapReduce任务的解析优化执行过程

4、metastore

​ Hive的元数据存储服务,一般将数据存储在关系型数据库中,为了实现Hive元数据的持久化操作,Hive的安装包中自带了Derby内存数据库,但是在实际的生产环境中一般使用mysql来存储元数据

未完待续。。。。。。。

3、Hive的访问流程图

在这里插入图片描述

Hive安装

安装基本要求

  • Java 1.7+
    Note: Hive versions 1.2 onward require Java 1.7 or newer. Hive versions 0.14 to 1.1 work with Java 1.6 as well. Users are strongly advised to start moving to Java 1.8 (see HIVE-8607).
  • Hadoop 2.x (preferred), 1.x (not supported by Hive 2.0.0 onward).
    Hive versions up to 0.13 also supported Hadoop 0.20.x, 0.23.x.
  • Hive is commonly used in production Linux and Windows environment. Mac is a commonly used development environment. The instructions in this document are applicable to Linux and Mac. Using it on Windows would require slightly different steps.

Hive可以从源码中编译安装,也可以直接使用官网下载的安装包,在此处我们选择安装包解压安装的方式。

Hive中最最重要的角色就是metastore

因此按照metastore的管理共有四种hive的安装搭建方式:官网参考地址如下:

https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration

Hive安装分类

​ 1、Local/Embedded Metastore Database(Derby)

​ 2、Remote Metastore Database

​ 3、Local/Embedded Metastore Server

​ 4、Remote Metastore Server

​ 根据上述分类,可以简单归纳为以下三类

​ 1、使用Hive自带的内存数据库Derby作为元数据存储

​ 2、使用远程数据库mysql作为元数据存储

​ 3、使用本地/远程元数据服务模式安装Hive

详细操作

​ 1、使用Hive自带的内存数据库Derby作为元数据存储
在这里插入图片描述

​ 2、使用远程数据库mysql作为元数据存储

在这里插入图片描述

​ 3、使用本地/远程元数据服务模式安装Hive

第一种:Hive远程数据库模式安装:

1、安装mysql

docker 安装mysql8.0

   69  yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
   70  sudo rm -rf /var/lib/docker
   71  sudo rm -rf /etc/docker
   72  sudo rm -rf  /etc/apparmor.d/docker
   73  sudo groupdel docker
   74  yum install -y yum-utils device-mapper-persistent-data lvm2 wget
   75  wget -O /etc/yum.repos.d/docker-ce.repo  https://download.docker.com/linux/centos/docker-ce.repo
   76  # 替换镜像地址:
   77  sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
   78  yum -y makecache fast
   79  yum -y install docker-ce-18.09.9
   88  systemctl start docker
   89  systemctl enable docker
   90  sudo mkdir -p /etc/docker
   91  sudo tee /etc/docker/daemon.json <<-'EOF'
   92  {
   93    "registry-mirrors": ["https://nqg17ogj.mirror.aliyuncs.com"]
   94  }
   95  EOF
   96  # 重载配置
   97  sudo systemctl daemon-reload
   98  sudo systemctl restart docker
  104  docker pull centos/mysql-80-centos7
  105  yum install bash-completion -y
  106  source /usr/share/bash-completion/bash_completion
  107  source <(docker  completion bash)
  108  docker images -a
  109  docker run -it -p 3306:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=123123 -d centos/mysql-80-centos7
  110  docker exec -it 106fce139521d5b82af49c540af22cedaab116406303f4f8157d075dc64e3d09 bash

# 添加mysql用户
use mysql
# 添加新用户
alter USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
# 分配权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
# 刷新权限
FLUSH PRIVILEGES;
2、安装hive
> 下载并解压hive
# 下载hive的bin包
wget https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
# 创建数据目录并解压
mkdir -p /app/bigdata
tar zxvf apache-hive-3.1.3-bin.tar.gz
> 修改环境变量
vi /etc/profile
export HIVE_HOME=/app/bigdata/hive-3.1.3
# 将bin目录添加到PATH路径中
> 修改配置文件
# 修改配置文件
cp hive-default.xml.template hive-site.xml
# 增加配置:
# 进入到文件之后,将文件原有的配置删除,但是保留最后一行,
# 从<configuration></configuration>,将光标移动到<configuration>这一行,
# 在vi的末行模式中输入以下命令
# :.,$-1d
<configuration>
			<property>
				<name>hive.metastore.warehouse.dir</name>
				<value>/user/hive/warehouse</value>
			</property>
			<property>
				<name>javax.jdo.option.ConnectionURL</name>
				<value>jdbc:mysql://mysql: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>123123</value>
			</property>
</configuration>
> 添加MySQL的驱动包拷贝到lib目录
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.1.0.tar.gz
tar -zxvf mysql-connector-j-8.1.0.tar.gz
cd /app/bigdata/apache-hive-3.1.3/lib/
cp /app/soft/mysql-connector-j-8.1.0/mysql-connector-j-8.1.0.jar ./
> 执行初始化元数据数据库的步骤
schematool -dbType mysql -initSchema

在这里插入图片描述
初始化完成如上图数据表

> 启动使用Hive
[root@hadoop2 conf]# hive
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/app/bigdata/apache-hive-3.1.3/bin:/app/bigdata/zookeeper-3.8.2/bin:/app/bigdata/hadoop-3.3.6/sbin:/app/bigdata/hadoop-3.3.6/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/app/bigdata/apache-hive-3.1.3/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/app/bigdata/hadoop-3.3.6/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 30f9915e-e256-4bc7-8eed-aa8c5b8a8f29

Logging initialized using configuration in jar:file:/app/bigdata/apache-hive-3.1.3/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = dabda467-b01e-439b-a0cb-eea541f99640
hive>
> hive基础使用

*注意:当进入hive的命令行开始编写SQL语句的时候,如果没有任何相关的数据库操作,那么默认情况下,所有的表存在于default数据库,在hdfs上的展示形式是将此数据库的表保存在hive的默认路径下,如果创建了数据库,那么会在hive的默认路径下生成一个database_name.db的文件夹,此数据库的所有表会保存在database_name.db的目录下。

建库,删库,建表,删表,数据增删改查

hive> show databases;
OK
default
test
Time taken: 0.69 seconds, Fetched: 2 row(s)
hive> create database test;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database test already exists
hive> drop database test
    > ;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database test is not empty. One or more tables exist.)
hive> use test
    > ;
OK
Time taken: 0.055 seconds
hive> drop table test_table;
OK
Time taken: 0.78 seconds
hive> drop database test;
OK
Time taken: 0.127 seconds

Time taken: 0.127 seconds
hive> create database test;
OK
Time taken: 0.115 seconds
hive> use test;
OK
Time taken: 0.082 seconds
hive> create table test(id int, name string);
OK
Time taken: 0.67 seconds
hive> insert into test values(1, 'zhangsan');
Query ID = root_20230720174610_dc274a49-a716-4a99-b357-3f70a625026e
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Job running in-process (local Hadoop)
2023-07-20 17:46:16,146 Stage-1 map = 0%,  reduce = 0%
2023-07-20 17:46:18,178 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_local2135657896_0001
Stage-4 is selected by condition resolver.
Stage-3 is filtered out by condition resolver.
Stage-5 is filtered out by condition resolver.
Moving data to directory hdfs://hadoop2:9000/user/hive/warehouse/test.db/test/.hive-staging_hive_2023-07-20_17-46-10_227_668086346405515490-1/-ext-10000
Loading data to table test.test
MapReduce Jobs Launched:
Stage-Stage-1:  HDFS Read: 0 HDFS Write: 152 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: 9.043 seconds
hive> select * from test;
OK
1	zhangsan
Time taken: 0.295 seconds, Fetched: 1 row(s)
hive> update test set name='lisi' where id=1;
FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
hive> delete from test where id=1;
FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.
hive>

第二种:Hive远程元数据服务模式安装

mysql准备要求同上

配置服务端
 <property>
		<name>hive.metastore.warehouse.dir</name>
		<value>/user/hive_remote/warehouse</value>
	</property>
	<property>
		<name>javax.jdo.option.ConnectionURL</name>
		<value>jdbc:mysql://mysql:3306/hive_remote?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>123123</value>
	</property>
配置客户端
<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/hive_remote/warehouse</value>
</property>
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://hadoop2:9083</value>
</property>
在服务端执行元数据库的初始化操作
schematool -dbType mysql -initSchema	
在服务端启动元数据服务
# 阻塞式窗口,其他服务连接连接
hive --service metastore 

访问hive方式

在客户端hadoop1启动hive
hive
hive> show tables;
# 出问题
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
hive>
# 解决
启动 hive --service metastore

Hiveserver2利用beeline访问
# 首先需要关闭hive的元数据服务和hiveserver2,然后关闭Hadoop集群
vim /hadoop-3.1.3/etc/hadoop/hdfs-site.xml
# 添加下面配置内容

<property>
	<name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>
# ——————————————————————————————————————————————————————————————————————————————
vim /hadoop-3.1.3/etc/hadoop/core-site.xml
# 添加如下内容

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>
————————————————

# 启动hiveserver2
hiveserver2
# 其他客户端访问
beeline -u jdbc:hive2://hadoop1:10000 -n root

0: jdbc:hive2://hadoop1:10000>

HiveSql

数据类型

支持的类型
hive支持两种数据类型:原始数据类型、复杂数据类型

原始数据类型

原始数据类型包括数据型,布尔型,字符串型,具体如下表:

类型 描述 示例
TINYINT(tinyint) 一个字节(8位)有符号整数, -128~127 1
SMALLINT(smallint) 2字节(16位)有符号整数,-32768~32767 1
INT(int) 4字节(32位)有符号整数 1
BIGINT(bigint) 8字节(64位)有符号整数 1
FLOAT(float) 4字节(32位)单精度浮点数 1.0
DOUBLE(double) 8字节(64位)双精度浮点数 1.0
DECIMAL(decimal) 任意精度的带符号小数 1.0
BOOLEAN(boolean) true/false true/false
STRING(string) 字符串,变长 ‘a’,‘b’,‘1’
VARCHAR(varchar) 变长字符串 ‘a’
CHAR(char) 固定长度字符串 ‘a’
BINANY(binany) 字节数组 无法表示
TIMESTAMP(timestamp) 时间戳,纳秒精度 122327493795
DATE(date) 日期 ‘2016-03-29’复杂数据类型

复杂数据类型

ARRAY 有序数组,字段的类型必须相同 Array(1,2)
MAP 一组无序的键值对,键的类型必须是原始数据类型,他的值可以是任何类型,同一个映射的键的类型必须相同,值得类型也必须相同 Map(‘a’,1)
STRUCT 一组命名的字段,字段类型可以不同 Struct(‘a’,1,2.0
UNION UNION则类似于C语言中的UNION结构,在给定的任何一个时间点,UNION类型可以保存指定数据类型中的任意一种

增删改查

--展示所有数据库
	show databases;
--切换数据库
	use database_name;
/*创建数据库		
	CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
	  [COMMENT database_comment]
	  [LOCATION hdfs_path]
	  [WITH DBPROPERTIES (property_name=property_value, ...)];
*/
	create database test;
/*
	删除数据库	
	DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];	
*/
	drop database database_name;
	/*
	创建表的操作
		基本语法:
		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 [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];   -- (Note: Available in Hive 0.5.0 and later; not 					supported for external tables)
 
		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  -- (Note: Available in Hive 0.7.0 and later)
 		基本数据类型
		primitive_type
 		 : TINYINT
 		 | SMALLINT
 		 | INT
 		 | BIGINT
 		 | BOOLEAN
 		 | FLOAT
 		 | DOUBLE
  		 | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
 		 | STRING
 		 | BINARY      -- (Note: Available in Hive 0.8.0 and later)
 		 | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
 		 | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
 		 | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
 		 | DATE        -- (Note: Available in Hive 0.12.0 and later)
 		 | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
 		 | CHAR        -- (Note: Available in Hive 0.13.0 and later)
 
		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, ... >  -- (Note: Available in Hive 0.7.0 and 			later)
 		行格式规范
		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]   -- (Note: Available in Hive 0.13 and later)
  			| 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
 		表约束
		constraint_specification:
 		 : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
 		   [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES 					table_name(col_name, ...) DISABLE NOVALIDATE 
*/

--创建普通hive表(不包含行定义格式)
	create table psn
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
--创建自定义行格式的hive表
	create table psn2
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';
--创建默认分隔符的hive表(^A、^B、^C)
	create table psn3
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	row format delimited
	fields terminated by '\001'
	collection items terminated by '\002'
	map keys terminated by '\003';
	--或者
	create table psn3
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
--创建hive的外部表(需要添加external和location的关键字)
	create external table psn4
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':'
	location '/data';
/*
	在之前创建的表都属于hive的内部表(psn,psn2,psn3),而psn4属于hive的外部表,
	内部表跟外部表的区别:
		1、hive内部表创建的时候数据存储在hive的默认存储目录中,外部表在创建的时候需要制定额外的目录
		2、hive内部表删除的时候,会将元数据和数据都删除,而外部表只会删除元数据,不会删除数据
	应用场景:
		内部表:需要先创建表,然后向表中添加数据,适合做中间表的存储
		外部表:可以先创建表,再添加数据,也可以先有数据,再创建表,本质上是将hdfs的某一个目录的数据跟				hive的表关联映射起来,因此适合原始数据的存储,不会因为误操作将数据给删除掉
*/	
/*
	hive的分区表:
		hive默认将表的数据保存在某一个hdfs的存储目录下,当需要检索符合条件的某一部分数据的时候,需要全量		遍历数据,io量比较大,效率比较低,因此可以采用分而治之的思想,将符合某些条件的数据放置在某一个目录		 ,此时检索的时候只需要搜索指定目录即可,不需要全量遍历数据。
*/
--创建单分区表
	create table psn5
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(gender string)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';
--创建多分区表
	create table psn6
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(gender string,age int)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';	
/*
	注意:
		1、当创建完分区表之后,在保存数据的时候,会在hdfs目录中看到分区列会成为一个目录,以多级目录的形式			  存在
		2、当创建多分区表之后,插入数据的时候不可以只添加一个分区列,需要将所有的分区列都添加值
		3、多分区表在添加分区列的值得时候,与顺序无关,与分区表的分区列的名称相关,按照名称就行匹配
*/	
--给分区表添加分区列的值
	alter table table_name add partition(col_name=col_value)
--删除分区列的值
	alter table table_name drop partition(col_name=col_value)
/*
	注意:
		1、添加分区列的值的时候,如果定义的是多分区表,那么必须给所有的分区列都赋值
		2、删除分区列的值的时候,无论是单分区表还是多分区表,都可以将指定的分区进行删除
*/
/*
	修复分区:
		在使用hive外部表的时候,可以先将数据上传到hdfs的某一个目录中,然后再创建外部表建立映射关系,如果在上传数据的时候,参考分区表的形式也创建了多级目录,那么此时创建完表之后,是查询不到数据的,原因是分区的元数据没有保存在mysql中,因此需要修复分区,将元数据同步更新到mysql中,此时才可以查询到元数据。具体操作如下:
*/	
--在hdfs创建目录并上传文件
	hdfs dfs -mkdir /msb
	hdfs dfs -mkdir /msb/age=10
	hdfs dfs -mkdir /msb/age=20
	hdfs dfs -put /root/data/data /msb/age=10
	hdfs dfs -put /root/data/data /msb/age=20
--创建外部表
	create external table psn7
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(age int)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':'
	location '/msb';
--查询结果(没有数据)
	select * from psn7;
--修复分区
	msck repair table psn7;
--查询结果(有数据)
	select * from psn7;
/*
	问题:
		以上面的方式创建hive的分区表会存在问题,每次插入的数据都是人为指定分区列的值,我们更加希望能够根		  据记录中的某一个字段来判断将数据插入到哪一个分区目录下,此时利用我们上面的分区方式是无法完成操作			的,需要使用动态分区来完成相关操作,现在学的知识点无法满足,后续讲解。
*/

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值