Hive系列(三)实操

本文详细介绍了Hive的使用,包括shell交互、Hive服务启动、脚本化运行。接着深入探讨了Hive的建库建表、数据导入导出,如内部表、外部表、分区表的创建,以及CTAS建表语法。同时讲解了Hive的存储格式,如TextFile、SequenceFile、RCFile、ORCFile和Parquet。此外,还涵盖了Hive的数据类型和DDL语言,如修改表名、分区等。
摘要由CSDN通过智能技术生成

一、Hive使用方式

shell交互

启动一个hive交互shell

bin/hive

启动hiveserver2

第一步:启动hive服务
前台启动命令:

bin/hiveserver2

后台启动命令:

# 不记录日志(日志路径可以根据自己设定)
nohup bin/hiveserver2 1>/dev/null 2>&1 &
# 记录日志
nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err &

第二步:可在其他节点使用beeline去连接
方式一

bin/beeline
# 回车,进入beeline界面
beeline> !connect jdbc:hive2://localhost:10000

方式二:

bin/beeline -u jdbc:hive2://localhost:10000 -n root

脚本化运行

大量的hive查询任务,如果用交互式shell来进行输入的话,显然效率及其低下,因此,生产中更多的是使用脚本化运行机制。
该机制的核心点是:hive可以用一次性命令的方式来执行给定的hql语句
hive -e

bin/hive -e "insert into table a select * from table b;"

hive -f
hive -f 后面跟sql文件

vim test.sql
insert into table a select * from table b;
bin/hive -f test.sql

二、Hive建库建表与数据导入

建库

hive中有一个默认的库:default 库目录:hdfs://localhost:9000/hive/warehouse
新建库:

create database test;

库建好后,在hdfs中会生成一个库目录:
hdfs://localhost:9000/hive/warehouse/test.db

建表

建表语法

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
EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
LIKE
允许用户复制现有的表结构,但是不复制数据。
ROW FORMAT
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive通过 SerDe 确定表的具体的列的数据。
DELIMITED FIELDS TERMINATED BY ‘,’ 字段分隔符
DELIMITED LINES TERMINATED BY ‘,’ 行分割符
CLUSTERED BY
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

把表(或者分区)组织成桶(Bucket)有两个理由:
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

内部表与外部表

外部表和内部表的特性差别:

  • 内部表的目录在hive的仓库目录中 VS 外部表的目录由用户指定
  • drop一个内部表时:hive会清除相关元数据,并删除表数据目录
  • drop一个外部表时:hive只会清除相关元数据

创建外部表

drop table if exists user_info_external;
create external table if not exists user_info_external(
user_id string comment '用户id',
user_name string comment '用户姓名',
user_gender string comment '用户性别',
user_age int comment '用户年龄',
province string comment '省份',
city string comment '城市'
)
comment '用户信息表'
row format delimited fields terminated by ',' lines terminated 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值