大数据学习09之Hive基础
1.Hive基本概念
1.1Hive简介
Hive 的前生属于 Facebook,用于解决海量结构化数据的统计分析,现在属于 Apache 软件基金会。Hive 是一个构建在Hadoop 之上的数据分析工具(Hive 没有存储数据的能力,只有使用数据的能力),底层由 HDFS 来提供数据存储,可以将结构化的数据文件映射为一张数据库表,并且提供类似 SQL 的查询功能,本质就是将 HQL 转化成 MapReduce 程序。说白了 Hive 可以理解为一个将 SQL 转换为 MapReduce 程序的工具,甚至更近一步说 Hive 就是一个 MapReduce 客户端。
总结:交互方式采用 SQL,元数据存储在 Derby 或 MySQL,数据存储在 HDFS,分析数据底层实现是 MapReduce,执
行程序运行在 YARN 上。
1.2HiveVS数据库(Mysql)
3.x.y版本以后Hive的索引被舍弃,事务也没有必要使用
1..3Hive的优缺点,为什么要使用Hive?
答:
优点:
操作接口采用类似 SQL 的语法,提供快速开发的能力(简单、容易上手)。
免去了写 MapReduce 的过程,减少开发人员的学习成本。
Hive 的执行延迟比较高,因此 Hive 常用于离线数据分析,对实时性要求不高的场合。
Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。
Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
集群可自由拓展并且具有良好的容错性,节点出现问题 SQL 仍可完成执行。
缺点:
Hive 的 HQL 表达能力有限,当逻辑需求特别复杂的时候,还是要借助 MapReduce。
迭代式算法无法表达
数据挖掘方面不擅长
Hive 操作默认基于 MapReduce 引擎,而 MapReduce 引擎与其它的引擎(如 Spark 引擎)相比,特点就是慢、延迟高、不适合交互式查询,所以 Hive 也有这个缺点(这里讲的是默认引擎,Hive 是可以更改成其他引擎的)。
Hive 自动生成的 MapReduce 作业,通常情况下不够智能化。
Hive 调优比较困难,粒度较粗。
总结:
Hive可以使得大数据程序员从写复杂的MapReduce代码,转写简单的SQL语句,极大的降低了开发难度,降低了人员成本。
功能扩展方便。
1.4Hive应用场景
日志分析:大部分互联网公司使用 Hive 进行日志分析,包括百度、淘宝等。
统计网站一个时间段内的 PV、UV
多维度数据分析
海量结构化数据的离线分析
1.5思考
2.Hive架构(重点)
2.1Client
Hive 允许 Client 连接的方式有三个 CLI(Hive Shell)、JDBC/ODBC(Java 访问 Hive)、WEBUI(浏览器访问 Hive)。JDBC/ODBC 访问中间件 Thrift 软件框架,跨语言服务开发。DDL DQL DML,整体仿写一套 SQL 语句。
2.2MetaStroe
元数据,数据的数据。元数据包括表名、表结构信息、表所属的数据库(默认是 default 库)、表的拥有者(权限信息)、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。
元数据的存放一般需要借助于其他的数据载体(Derby 或 MySQL),默认存放在自带的 Derby 数据库(单用户局限性)中,推荐使用 MySQL 进行存储。连接数据库需要提供:uri、username、password、driver。
元数据服务的作用是:客户端连接 MetaStroe 服务,MetaStroe 服务再去连接 MySQL 数据库来存取元数据。有了
MetaStroe 服务,就可以有多个客户端同时连接,而且这些客户端不需要知道 MySQL 数据库的用户名和密码,只需要连接
MetaStroe 服务即可。
2.3Driver(重中之重)
解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 ANTLR;对AST 进行语法分析,分析查询语法和查询计划,检查 SQL 语义是否有误。
编译器(Compiler):获取元数据,检查表是否存在、字段是否存在,然后将 AST 编译生成逻辑执行计划。
优化器(Query Optimizer):对逻辑执行计划进行优化。
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。最后根据优化后的物理执行计划生成底层代码进
行执行,对于 Hive 来说,就是 MR/Spark。
大致流程:
1.Parser将SQL语句解析成抽象语法树(AST:abstract syntax tree);
2.Semantic Analyze将抽象语法树编译成查询块;
3.Logic Plan Generator将查询快转换成逻辑查询计划;
4.Logic Optimizer重写逻辑查询计划,优化逻辑查询计划(ROB);
5.Physical Plan Generater将逻辑计划转化为物理计划;
6.Physical Optimizer选择最佳join策略,优化物理执行计划(CBO);
7.Execution最后根据优化后的物理执行计划生成底层代码,进行执行。
2.4HDFS
Hive 的数据存储在 HDFS 中,计算由 MapReduce 完成。HDFS 和 MapReduce 是源码级别上的整合,两者结合最佳。解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
3.Hive工作原理
将HDFS文件路径保存到MetaStore,建立表与数据的映射关系;
用户输入SQL语句后,Hive自动将其转换为MapReduce或者Spark任务,提交到YARN上运行,执行成功并返回结果。
在搭建 Hive 数据仓库时,就会将 SQL 语句的常用指令操作,比如 SELECT、FROM、WHERE 以及函数等用 MapReduce写成模板,并且将这些 MapReduce 模板封装到 Hive 中。
那我们所需要做的,就是根据业务需求编写相应的 SQL 语句,Hive 会自动的到封装好的 MapReduce 模板中去进行匹配。匹配完后将运行 MapReduce 程序,生成相应的分析结果,然后反馈给我们。总之就是做离线数据分析时,Hive 要比
直接使用 MapReduce 开发效率更高。
4.Hive安装
HIve安装配置(超详细)-CSDN博客
4.1单节点环境搭建
将准备好的安装包上传至 node01,然后解压:
tar zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/Hive
rm apache-hive-3.1.3-bin.tar.gz
修改配置文件
cd /opt/apache-hive-3.1.3-bin/conf/
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
在文件末尾添加以下内容:
HADOOP_HOME=/opt/hadoop-3.3.4/
export HIVE_CONF_DIR=/opt/apache-hive-3.1.3-bin/conf
export HIVE_AUX_JARS_PATH=/opt/apache-hive-3.1.3-bin/lib
修改配置文件 hive-site.xml :
cp hive-default.xml.template hive-site.xml
vim hive-site.xml
首先删除 configuration 节点中的所有内容,然后再在 configuration 节点中添加以下内容:
<!-- 数据库相关配置 -->
<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.cj.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>
<!-- 强制 MetaStore 的 schema 一致性,开启的话会校验在 MetaStore 中存储的信息的版本和 Hive 的 jar 包中的版
本一致性,并且关闭自动 schema 迁移,用户必须手动的升级 Hive 并且迁移 schema。关闭的话只会在版本不一致时给出警
告,默认是 false 不开启 -->
<!-- 元数据校验 -->
<property>
<name>hive.metastore.schema.verification</name>
<!-- MySQL8 这里一定要设置为 true,不然后面 DROP TABLE 可能会出现卡住的情况 -->
<value>true</value>
</property>
<!-- 美化打印数据 -->
<!-- 是否显示表名与列名,默认值为 false -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 是否显示数据库名,默认值为 false -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- Hive 数据仓库的位置(HDFS 中的位置) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<!-- HiveServer2 通过 Thrift 访问 MetaStore -->
<!-- 配置 Thrift 服务绑定的服务器地址,默认为 127.0.0.1 -->
<!--
<property>
<name>hive.server2.thrift.bind.host</name>
<value>127.0.0.1</value>
</property>
-->
<!-- 配置 Thrift 服务监听的端口,默认为 10000 -->
<!--
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
-->
<!-- HiveServer2 的 WEBUI -->
<!-- 页面中会显示当前链接的会话,包括IP、用户名、当前执行的操作(查询)数量、链接总时长、空闲时长等 -->
<property>
<name>hive.server2.webui.host</name>
<value>node01</value>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</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>
<!-- 客户端连接 Hive 元数据的超时时间,默认为 600s -->
<!-- 需要一个时间单位(d/day, h/hour, m/min, s/sec, ms/msec, us/usec, ns/nsec),如果未指定,默认为秒 -->
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>600s</value>
</property>
前面提到 Hive 实际上底层跑的仍然是 MapReduce 程序,那么我们需要让它拥有在 Hadoop 上运行的权限,修改
Hadoop 的配置文件 core-site.xml :
vim /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml
在 configuration 节点中末尾处添加以下内容:
<!-- 该参数表示可以通过 httpfs 接口访问 HDFS 的 IP 地址限制 -->
<!-- 配置 root(超级用户) 允许通过 httpfs 方式访问 HDFS 的主机名、域名 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!-- 通过 httpfs 接口访问的用户获得的群组身份 -->
<!-- 配置允许通过 httpfs 方式访问的客户端的用户组 -->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
配置日志组件
首先创建日志目录:
mkdir /opt/apache-hive-3.1.3-bin/logs
cp hive-log4j2.properties.template hive-log4j2.properties
vim hive-log4j2.properties
将 property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name} 替换为:
property.hive.log.dir = /opt/apache-hive-3.1.3-bin/logs
添加驱动包:
将 MySQL 驱动包(注意自己的 MySQL 版本)添加到 Hive 的 lib 目录下:
mv mysql-connector-java-8.0.18.jar /opt/apache-hive-3.1.3-bin/lib/
拷贝至其他节点:
scp -r root@node01:/opt/apache-hive-3.1.3-bin /opt/
配置环境变量:
三个节点修改环境变量 vim /etc/profile ,在文件末尾添加以下内容:
export HIVE_HOME=/opt/apache-hive-3.1.3-bin
export PATH=$HIVE_HOME/bin:$PATH
修改完成后 source /etc/profile 重新加载环境变量。
5.Hive交互方式
5.1直接界面交互
输入hive命令
5.2hive2
beeline方式
beeline -u jdbc:hive2://node01:10000 -n root
HA 方式
jdbc:hive2://<zookeeperquorum>/<db>;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-ha
完整连接方式如下:
beeline -u
"jdbc:hive2://node01:2181,node02:2181,node03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=h
iveserver2-ha" -n root
5.3参数执行
使用 -e 参数来直接执行 HQL 的语句。
# 单节点
bin/beeline -u "jdbc:hive2://node01:10000/default" -n root hive -e "SHOW DATABASES;"
# HA 方式
bin/beeline -u
"jdbc:hive2://node01:2181,node02:2181,node03:2181/default;serviceDiscoveryMode=zooKeeper;zooKeeperName
space=hiveserver2-ha" -n root hive -e "SHOW DATABASES;"
使用 -f 参数通过指定文本文件来执行 HQL 的语句。
# 单节点
bin/beeline -u "jdbc:hive2://node01:10000/default" -n root hive -f "default.sql"
# HA 方式
bin/beeline -u
"jdbc:hive2://node01:2181,node02:2181,node03:2181/default;serviceDiscoveryMode=zooKeeper;zooKeeperName
space=hiveserver2-ha" -n root hive -f "default.sql"
5.4总结
MetaStore 服务实际上就是一种 Thrift 服务,通过它我们可以获取到 Hive 元数据。通过 Thrift 服务获取原数据的方式,屏蔽了数据库访问需要的驱动,URL,用户名,密码等细节。
HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对 Hive 的查询并返回结果。一般来讲,我们认为HiveServer2 是用来提交查询的,而 MetaStore 才是真正用来访问元数据的,所以推荐使用第二种,这种方式更加安全或者
从设计上来讲更加合理,如下图所示。
6.Hive 元数据/数据类型
7.Hive基础(重点)
7.1数据库
7.1.1创建数据库
#创建一个数据库,数据库在 HDFS 上默认的存储路径是 /hive/warehouse/*.db 。
# 创建数据库
CREATE DATABASE TEST;
#避免要创建的数据库已经存在错误,可以使用 IF NOT EXISTS 选项来进行判断。(标准写法)
CREATE DATABASE IF NOT EXISTS crm;
指定数据库创建的位置(数据库在 HDFS 上的存储路径)。
CREATE DATABASE IF NOT EXISTS school location '/hive/school.db';
7.1.2修改数据库
#用户可以使用 ALTER DATABASE 命令为某个数据库的 DBPROPERTIES 设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
ALTER DATABASE school SET DBPROPERTIES('createtime'='20220803');
7.1.3数据库详情
#显示所有数据库。
SHOW DATABASES;
#可以通过 like 进行过滤。
SHOW DATABASES LIKE 's*';
#查看某个数据库的详情。
DESC DATABASE school;
DESCRIBE DATABASE school;
#切换数据库。
USE school;
7.1.4删除数据库
#最简写法。
DROP DATABASE school;
#如果删除的数据库不存在,最好使用 IF EXISTS 判断数据库是否存在。否则会报错: FAILED:
SemanticException [Error 10072]: Database does not exist: school 。
DROP DATABASE IF EXISTS school;
#如果数据库不为空,使用 CASCADE 命令进行强制删除。否则会报错: FAILED: Execution Error, return #code40000 from org.apache.hadoop.hive.ql.ddl.DDLTask. #InvalidOperationException(message:Database
#school is not empty. One or more tables exist.)
DROP DATABASE IF EXISTS school CASCADE;
7.2数据表
7.2.1语法
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 ]
7.2.2创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(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]
字段解释说明:
CREATE TABLE :创建一个指定名称的表。如果相同名称的表已经存在,则抛出异常;可以使用 IF NOT EXISTS
选项来进行判断。
EXTERNAL :此关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)。
: 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 ]
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(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]
31
创建内部表时,会将数据移动到数据仓库指向的路径(默认位置);
创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
COMMENT :为表和列添加注释。
PARTITIONED BY :创建分区表。
CLUSTERED BY :创建分桶表。
SORTED BY :排序方式,不常用。
ROW FORMAT : DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH
SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)] 。
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT
DELIMITED,将会使用自带的 SerDe(默认是 LazySimpleSerDe 类,只支持单字节分隔符)。
在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确
定表的具体的列的数据。
SerDe 是 Serialize/Deserilize 的简称,目的是用于序列化和反序列化。
STORED AS :指定存储文件的类型。常用的存储文件类型有:
SEQUENCEFILE(二进制序列文件)
TEXTFILE(文本)
RCFILE(列式存储格式文件)如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用
STORED AS SEQUENCEFILE
LOCATION :指定表在 HDFS 上的存储位置。
LIKE :允许用户复制现有的表结构,但是不复制数据。
7.3内外部表
所谓内部表(managed table)即 Hive 管理的表,Hive 内部表的管理既包含逻辑以及语法上的,也包含实际物理意义上的,即创建 Hive 内部表时,数据将真实存在于表所在的目录内,删除内部表时,物理数据和文件也一并删除。默认创建的是内部表。
外部表(external table)则不然,其管理仅仅只是在逻辑和语法意义上的,即新建表仅仅是指向一个外部目录而已。同样,删除时也并不物理删除外部目录,而仅仅是将引用和定义删除。
一般情况下,在企业内部都是使用外部表的。因为会有多人操作数据仓库,可能会产生数据表误删除操作,为了数据安全性,通常会使用外部表,且方便达到数据共享。
外部表则不一样,数据的创建和删除完全由自己控制,Hive 不管理这些数据。
7.4导出数据
7.4.1通过SQL
首先在 HiveServer2 的节点上创建一个存储导出数据的目录。
mkdir -p /root/user
执行以下命令将查询结果导出到本地。
-- 将查询结果导出到本地
INSERT OVERWRITE LOCAL DIRECTORY '/root/user' SELECT * FROM t_user;
7.4.2通过HDFS
首先在 HDFS 上创建一个存储导出数据的目录。
hdfs dfs -mkdir -p /export/person
使用 HDFS 命令拷贝文件到其他目录。
hdfs dfs -cp /hive/warehouse/t_person/* /export/person
7.5基本查询、多表查询
与Mysql 99%相同