当前位置: 首页 > article >正文

大数据学习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%相同

7.6连接查询


http://www.kler.cn/a/386010.html

相关文章:

  • Spring Boot3 实战案例合集上线了
  • Spring Boot 启动时自动配置 RabbitMQ 交换机、队列和绑定关系
  • 智能化护士排班系统的设计与实现(文末附源码)
  • 华为数字化转型的本质为何是管理变革
  • 鸿蒙 管理应用拥有的状态有Localstorage、Appstorage、PersistentStorage、Environment、用户首选项、持久化方案。
  • Go语言的零值可用性:优势与限制
  • Beyond Compare 5 比较文本文件时,如何忽略字母的大小写差异?
  • docker入门(一)
  • unity显示获取 年月日周几【日期】
  • 关于Django 模型字段 `choices`自定义数据类型的枚举——补充
  • Java SPI——针对实习面试
  • 汽车和飞机研制过程中“骡车”和“铁鸟”
  • EL表达式和JSTL表达式(详解)
  • 【java】实战-力扣题库:移动零
  • Dubbo框架浅谈
  • 数字IC后端设计实现之Innovus自动修复Min Step DRC Violation方案
  • Agent指令编排
  • 双指针算法的妙用:提高代码效率的秘密(1)
  • ip地址跟路由器有关吗?更换路由器ip地址会变吗
  • iMeta | 复杂热图(ComplexHeatmap)可视化文章最新版,画热图就引它
  • 如何保证kafka生产者数据可靠性
  • Git别名设置
  • 【51单片机】LED点阵屏 原理 + 使用
  • 【数据分享】1901-2023年我国省市县镇四级的逐年降水数据(免费获取/Shp/Excel格式)
  • entos7离线安装xrdp和图形化桌面
  • 改进系列(3):基于ResNet网络与CBAM模块融合实现的生活垃圾分类