作者:duktig
博客:https://duktig.cn (文章首发)
优秀还努力。愿你付出甘之如饴,所得归于欢喜。
更多文章参看github知识库:https://github.com/duktig666/knowledge
学习完Hadoop,有没有感到编写一个MapReduce程序非常复杂,想要进行一次分析和统计需要很大的开发成本。那么不如就来了解了解Hadoop生态圈的另一名成员——Hive。让我们一起来了解,如何使用类SQL语言进行快速查询和分析数据吧。
Hive系列文章如下:
Hive:由Facebook 开源用于解决 海量结构化日志的数据统计 的工具。
Hive 是基于 Hadoop 的一个 数据仓库工具,可以 将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。
将 HQL 转化成MapReduce 程序 。主要如下:
因为Hive 的执行延迟比较高,所以
Hive运行机制:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ixi0lOEd-1635823143449)(C:\Users\rsw\AppData\Roaming\Typora\typora-user-images\image-20211102105231171.png)]
Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver,结合元数据(MetaStore),将这些指令翻译成 MapReduce,提交到Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口。
由于 Hive 采用了类似 SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的。
由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言HQL。熟悉 SQL 开发的开发者可以很方便的使用Hive 进行开发。
由于Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的。
而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET 修改数据。
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。
另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive 查询时,也会有较高的延迟。
相对的,数据库的执行延迟较低。
当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。
由于Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
win10安装Hive
参看:win10安装Hive3.0.0
注意:在修改 hive-site.xml 时有问题。
官网给出的文件如下:
<configuration>
configuration>
注意将 property
属性添加到 configuration
标签内。
jdbc连接属性参考:
jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&characterEncoding=latin1&useSSL=false&serverTimezone=Asia/Shanghai
hive的启动
# 启动 Hive 元数据
hive --service metastore
# 启动 Hive server2 服务
hive --service hiveserver2
# 启动 hive 命令行
hive
hive删除表时直接卡死
报错:
ERROR exec.DDLTask: Failed
org.apache.hadoop.hive.ql.metadata.HiveException: show Locks LockManager not specified
解决:
$HIVE_HOME/conf/hive-site.xml中加入:
<property>
<name>hive.support.concurrencyname>
<value>truevalue>
property>
<property>
<name>hive.txn.managername>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManagervalue>
property>
然后重启metastore和hiveserver2。
卡死hive的metastore报错:
<property>
<name>hive.metastore.event.db.notification.api.authname>
<value>falsevalue>
property>
在mysql的hive元数据库中执行如下代码:
-- 修改表字段注释字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COMMENT` varchar(256) CHARACTER SET utf8;
-- 修改表字段名字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COLUMN_NAME` varchar(767) CHARACTER SET utf8;
-- 修改表属性Key和Value字符集
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
-- 修改分区属性Key和Value字符集
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
-- 修改分区字段Key和Value字符集
ALTER TABLE PARTITION_KEYS MODIFY COLUMN `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8;
ALTER TABLE PARTITION_KEY_VALS MODIFY COLUMN `PART_KEY_VAL` varchar(256) CHARACTER SET utf8;
-- 修改分区的分区名字符集
ALTER TABLE `PARTITIONS` MODIFY COLUMN `PART_NAME` varchar(767) CHARACTER SET utf8;
-- 修改索引属性Key和Value字符集
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
修改hive-site.xml中JDBC的连接编码为utf8
建表:
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
表的数据test.txt:
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long
guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
上传表的数据:
load data local inpath './test.txt' overwrite into table test;
查询数据:
select friends[1],children['xiao song'],address.city from
test
where name="songsong";
具体的DDL和DML语句将在下篇文章分析。