大数据学习09之Hive基础

news/2024/11/14 21:50:51/

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.ppmy.cn/news/1546399.html

相关文章

【React】深入理解 JSX语法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

Hive 查询各类型专利 top10 申请人及专利申请数

Hive 查询各类型专利 top10 申请人及专利申请数 一、背景 在专利数据处理中&#xff0c;我们常常需要分析不同类型专利下申请人的活跃度。例如&#xff0c;给定一个专利明细表 t_patent_detail&#xff0c;其中包含专利号、专利名称、专利类型、申请时间、授权时间和申请人等…

昇思大模型平台打卡体验活动:项目5基于MindSpore实现Transformer机器翻译

首先仍然是先登录大模型体验平台 https://xihe.mindspore.cn/my/clouddev 启动&#xff01;&#xff01; 进入环境之后&#xff0c;即可开始运行notebook&#xff0c; Transformer 模型与实现 Transformer 是一种由 Vaswani 等人在 2017 年提出的神经网络结构&#xff08;论文…

parallelStream()使用注意点

parallelStream()使用中的注意点&#xff1a; 1、并行流如果使用&#xff0c;最好使用自定义的线程池&#xff0c;避免使用默认的线程池&#xff0c;以免千万阻塞或者资源竞争等问题。 2、parallelStream适用的场景是CPU密集型的&#xff0c;假如本身电脑CPU的负载很大&#…

Maven最佳实践

文章目录 1.摘要 本文主要介绍Maven使用&#xff0c;作为Maven使用手册来记录。 2.介绍 Maven是项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#xff0c;使用pom.xml 文件进行依赖管理和项目构建。 Maven 中pom.xml 是根据坐标信息来定位资源的位置&a…

什么是网络安全CTF有何意义?该如何入门?

什么是网络安全CTF?有何意义 &#xff1f;该如何入门 &#xff1f; 什么是网络安全CTF? CTF在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。它起源于1996年DEFCON&#xff0c;以代替之前通过互相发起真实攻击进行技术比拼的方式。发展至今&#xff…

11.11机器学习_介绍和定义

一、 机器学习介绍与定义 1. 机器学习定义 机器学习&#xff08;Machine Learning&#xff09;本质上就是让计算机自己在数据中学习规律&#xff0c;并根据所得到的规律对未来数据进行预测。 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习&#xff08;Deep…

单体架构 IM 系统之长轮询方案设计

在上一篇技术短文&#xff08;单体架构 IM 系统之核心业务功能实现&#xff09;中&#xff0c;我们讨论了 “信箱模型” 在单体架构 IM 系统中的应用&#xff0c;“信箱模型” 见下图。 客户端 A 将 “信件” 投入到客户端 B 的 “信箱” 中&#xff0c;然后客户端 B 去自己的 …