Hive 分区表 数据加载
1. Hive表数据的导入方式
1.1 本地上传至hdfs
命令:
hdfs dfs -put [文件名] [hdfs绝对路径]
例如:测试文件 test_001.txt 内容如下
在 hdfs 绝对路径:/user/hive/warehouse/mytest.db/ 下有一张表 test_001,建表语句如下:
create table test_001(id string, name string) row format delimited fields terminated by '\t';
使用如下命令将 test_001.txt 的内容上传至 /user/hive/warehouse/mytest.db/test_001 表中
hdfs dfs -put test_001.txt /user/hive/warehouse/mytest.db/test_001
注意:
test_001.txt 文件内容中:数据类型、数据列数、列数之间的分隔符要与 hdfs 中 test_001 表定义的一一对应。
1.2 本地导入
命令:
load data local inpath [本地文件路径] into table [表名];
示例:
load data local inpath '/user/xiaomin.liu/hive_testdata/student.csv' into table student;
含义:
将 /user/xiaomin.liu/hive_testdata 目录下 student.csv 文件的内容加载至 hdfs 中的 student 表中。
注意:
1. student.csv 文件内容中:数据类型、数据列数、列数之间的分隔符要与 hdfs 中 student 表定义的一一对应。
2. 使用本地导入的方式加载数据至 hive,使用的是复制操作,即当本地路径下的文件被加载至 hive 后,该本地路径下的文件依然存在,不会消失。
1.3 hdfs导入
命令:
load data inpath [文件在hdfs中的路径] into table [表名];
示例:
load data inpath '/user/warehouse/test/student.txt' into table student;
含义:
将 hdfs 路径为 /user/warehouse/test 下的 student.txt 文件的数据加载至 hdfs 中的 student 表中。
注意:
使用 hdfs 导入数据至 hive,使用的是剪切操作,即原 hdfs 路径下的文件在被导入至 hive 后,原 hdfs 路径下的文件将不存在了。
1.4 覆盖导入
本地导入命令:
load data local inpath [本地文件路径] overwrite into table [表名];
hdfs导入命令:
load data inpath [hdfs文件路径] overwrite into table [表名];
示例:
本地导入命令:
load data local inpath '/user/xiaomin.liu/hive_testdata/student.csv' overwrite into table student;
hdfs导入命令:
load data inpath '/user/warehouse/test/student.txt' overwrite into table student;
含义:
同1.2中的本地导入和1.3中的 hdfs 导入类似,只是新增的关键字 overwrite 会将表中已有的数据进行覆盖操作。
1.5 查询导入
命令:
create table [目标table_name] as select * from [已存在table_name];
示例:
create table sub_student as select * from student;
含义:将表 student 的结构与数据复制一份给到表 sub_student。
1.6 insert导入
追加模式命令:
insert into table [表名] select * from [已存在table_name];
示例:
insert into table sub_student select * from student;
含义:将表 student 的数据以 append 追加的方式写入表 sub_student 中。
覆盖模式命令:
insert overwrite table [表名] select * from [已存在table_name];
示例:
insert overwrite table sub_student select * from student;
含义:将表 student 的数据以覆盖的方式写入表 sub_student 中。
2. Hive 分区表操作
1.1 分区表的概念
Hive 中分区表的意思是按照表的某一列列名(1个字段)或某几列列名(多个字段)作为类似文件夹的形式来隔离分开存放数据,以便提高检索效率和管理效率。
例如:
公司要收集网站用户登录日志进行用户数据行为分析,假设已存在 /user/login/warehouse/login_record 作为记录登录日志的存储表,如果每天都将日志写入该表,日积月累,login_record 表内容越来越多。
在查询时进行全表扫描耗费的资源会非常多,等待的时间也会特别长。严重影响到了数据分析的效率。
在这种情况下,我们可以采用创建分区表的方法来创建 login_record 表,以日期对login_record 表进行分区,不同日期的日志信息存储到不同的日期分区中。在查询时可指定日期分区来进行查询,可以有效提高查询效率。
简言之,分区表是指在系统上建立文件夹,把不同维度的分类数据放在不同文件夹下面,查询时通过 where 子句过滤,只对指定目录下的内容进行查询,加快查询速度。
1.2 分区表创建语法
分区表 hive sql 创建语句如下:
create table login_logs(l_id string, l_loginName string, l_date string) partitioned by (date string) row format delimited fields terminated by '\t';
分区表在创建时关键字是:partitioned by
括号里跟上分区字段名及其字段类型,这样在创建表时就指明要创建的是一个分区表,上述创建语句说明要创建一个分区字段为:date,且类型为 string 类型的分区表,表名是 login_logs。
1.3 多分区表创建方式
多分区表 hive sql 创建语句如下:
create table login_logs(l_id string, l_loginName string, l_date string) partitioned by (year string, month string) row format delimited fields terminated by '\t';
与1.2中分区表创建语句的区别在于关键字 partitioned by 后面的参数是指定了多个分区字段,每个分区字段都需要指定字段类型,多字段之间以逗号分隔。
例如:
dws_test_001_daily_df 表有2个分区字段,分区字段分别是:dt,hotel。
hdfs多分区(文件夹)信息查询:一级分区(文件夹)
命令:
hive>dfs -ls /user/hive/warehouse/dws.db/dws_test_001_daily_df;
上图展示的是一级分区字段:dt,相当于一级文件夹。
hdfs多分区(文件夹)信息查询:二级分区(文件夹)
命令:
hive>dfs -ls /user/hive/warehouse/dws.db/dws_test_001_daily_df/dt=2021-08-09;
上图展示的是二级分区字段:hotel,相当于二级文件夹。
load 数据时可以指定分区来存储目标数据,然后在查询时 where 条件设置 dt 和 hotel 为指定目标值,则可达到缩小数据查询范围的目的,进而提高查询效率。
1.4 查看分区数据
1.查看分区表数据
命令:
select * from login_logs where year='2021' and month='11';
查询 sql 中以分区字段 year 和 month 作为 where 条件进行查询,与普通的 mysql 语句在语法上没有区别,但是在数据底层意义上差异较大,使用分区字段进行条件查询,相当于在指定目录:year='2021' 且 month='11' 下进行数据的搜索。
2.查看分区信息
命令:
show partitions dws.dws_test_001_daily_df partition(dt='2021-10-31');
上图可以看出查询结果为一级分区 dt=2021-10-31下所有二级分区 hotel 的信息。
1.5 分区表加载数据
分区表加载数据的方式与非分区表没有本质区别,只是在语法上有些许变化,具体加载数据的方式可参考上方的 Hive 表数据的导入方式。
示例:
分区表从本地导入 hdfs 语法:
load data local inpath '/user/xiaomin.liu/hive_testdata/login_data.csv' overwrite into table login_logs partition(year='2021', month='10');
含义:
将本地的 login_data.csv 文件内容导入到 hdfs 中 login_logs 表的year='2021',month='10' 的分区中。
1.6 修改分区
命令:
ALTER TABLE table_name PARTITION (dt='2021-08-08') SET LOCATION "new location";
ALTER TABLE table_name PARTITION (dt='2021-08-08') RENAME TO PARTITION (dt='20210808');
1.7 添加分区
添加分区命令:
hive>alter table tmp_table add partition(dt="2021-12-01", hotel= "AAA");
插入数据命令:
hive>insert into tmp_table partition(dt="2021-12-01", hotel= "AAA") values('test_001', 100);
1.8 删除分区
命令:
ALTER TABLE tmp_table DROP IF EXISTS PARTITION (dt="2021-12-01", hotel= "AAA");
小结:
Hive 的分区相当于按文件夹对文件进行分类存储,文件夹名可类比成分区字段名。
分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正的存储在数据表文件中,是所谓伪列。
因此,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。
比如上面的分区依据的列 year 和 month 并不真正的存在于数据表 login_logs 中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如 login_logs 表的字段 l_loginName 来分区。
欢迎关注【无量测试之道】公众号,回复【领取资源】
Python+Unittest框架API自动化、
Python+Unittest框架API自动化、
Python+Pytest框架API自动化、
Python+Pandas+Pyecharts大数据分析、
Python+Selenium框架Web的UI自动化、
Python+Appium框架APP的UI自动化、
Python编程学习资源干货、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。
备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。
包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。
微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!
Hive 分区表 数据加载相关推荐
- Hive的数据加载与导出
普通表的加载 1.load方式 load data [local] inpath [源文件路径] into table 目标表名; 从HDFS上加载数据,本质上是移动文件所在的路径 load data ...
- Hive表路径修改和分区表数据加载命令
1.对于同一张表,如果不是分区,那要变更数据来源,就只有改变其hdfs存储路径: 修改tmp_fjs_ftp表的location,两种方式: 方式一:通过修改表DDL alter table tmp_ ...
- track_info分区表的创建并将ETL的数据加载到Hive表
文章目录 track_info分区表的创建 将ETL的数据加载到Hive表 track_info分区表的创建 分区表 因为日志是一天一个分区 create external table track_i ...
- Hive的基本操作-表结构修改和数据加载
分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启 Hive 的分桶功能 set hive.enforce.bucketin ...
- hive分区、数据加载、数据导出、数据类型
一.hive分区 1.特点: 分区表与其他表不同点在于,分区字段的值为表目录下的子目录格式 ,为: 分区字段=值 2.建表语句 create database learn2; CREATE TABLE ...
- Spark _25.plus _使用idea读取Hive中的数据加载成DataFrame/DataSet(四)
对Spark _25 _读取Hive中的数据加载成DataFrame/DataSet(四) https://georgedage.blog.csdn.net/article/details/10309 ...
- Spark _25 _读取Hive中的数据加载成DataFrame/DataSet(四)
由于Hive不在本地,操作略显麻烦.不过细心一点,分析错误,也还好,如果你搭建的hadoop是HA,需要多注意: 这里指出一个错误,如果你报了同类错误,可以参考:https://georgedage. ...
- hive 导入hdfs数据_将数据加载或导入运行在基于HDFS的数据湖之上的Hive表中的另一种方法。
hive 导入hdfs数据 Preceding pen down the article, might want to stretch out appreciation to all the well ...
- hive 复合类型_hive原生和复合类型的数据加载和使用
原生类型 原生类型包括TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY (Hive 0.8.0以上才可用),TIMESTAM ...
最新文章
- 带进度条的ASP无组件断点续传下载代码
- 【7集iCore3基础视频】7-7 Qt5.2.1安装
- 简单的ALV显示例子
- 无边框窗体移动的方法
- 结合源码深入理解Android Crash处理流程
- 三星关闭shell提示_啄木鸟家庭维修|三星滚筒洗衣机4c故障代码
- ZZULIOJ 1057:素数判定
- 计算机网络基础代码,计算机网络基础知识(示例代码)
- Git实现从本地添加项目到远程仓库
- 对anaconda虚拟环境进行迁移
- 微信小程序云开发教程-WXML入门-条件渲染
- Android——8种通知栏-适配 Adnroid12
- 怎样更改itunes备份位置_正确修改itunes备份文件路径方法
- Win10环境下运行红色警戒等老款游…
- java 显示百分比_Java 数字转百分比%
- linux创建虚拟声卡,修改服务器版linux系统上的dummy虚拟声卡最大声道数
- window.name属性
- Java开发常用词汇表
- EasyRTMP手机直播推流到EasyDSS进行RTMP直播过程中分辨率反复切换崩溃问题解决
- php touppercase strtoupper,php大小写转换函数(strtolower、strtoupper)用法介绍