在本地数据创建数据文件:
vi /tmp/data.txt
1,jack nn,25,男,1995-01-01
2,jerry ss,30,女,1990-05-10
3,joker dd,35,男,1985-10-23
在Hive中新建表:
create database if not exists z3;
create table if not exists z3.mate(
id int,
name string,
age int,
gender string,
birthday date
) comment '张三用来记录朋友生日的表'
row format delimited
fields terminated by ',';
加载data.txt中的所有行到z3.mate表中:
load data local inpath '/tmp/data.txt' into table z3.mate;
分析:加载本地文件需要加上local
选项
完成加载后查询:
use z3;
select * from mate;
从本地文件系统加载数据一般使用/
开头的绝对路径,快速得到某个文件的绝对路径可以使用readlink -f
或者locate
命令
加载到Hive数据仓库以后,数据文件会保存在默认存储位置,一般不经过额外设置是/user/hive/warehouse
这个路径,要查看这个路径,需要使用HDFS的命令
hadoop fs -ls /user/hive/warehouse
在使用HDFS文件系统时,使用hadoop fs
和hdfs dfs
效果是一样的,只是写法不一样
估算文件大小:
hadoop fs -ls /user/hive/warehouse/z3.db/mate
86字节换算过来是 \frac{86}{1024} \approx 0.08 KB
HDFS中可以使用-cat
选项在屏幕上打印所有的内容,或者使用 -tail
选项查看最近一次追加到文件内的行
一般常用的就是tail命令了,不过只能看最后1KB的文本内容,但是会比cat一次性打出所有内容方便一些
hadoop fs -tail /user/hive/warehouse/z3.db/mate/data.txt
如果要查看文件的头几行,可以组合使用HDFS中的cat和(Linux自带的)more命令,用法如下:
hadoop fs -cat /user/hive/warehouse/z3.db/mate/data.txt | more # 在两个命令中间加上管道符|
使用相对路径时需要根据当前工作目录来确定路径
-- Hive中使用叹号开头表示执行Linux Shell命令,且命令要以分号结尾;
!pwd;
使用相对路径查看文件:
!cp /tmp/data.txt ./d2.txt;
!ls ./d2.txt;
这个过程是将数据文件拷贝到当前工作目录下的d2.txt,用于跟之前的data.txt进行区分
load data local inpath './d2.txt' into table z3.mate;
查看该数据文件:
hadoop fs -ls /user/hive/warehouse/z3.db/mate/
先将数据从本地传到HDFS
hadoop fs -mkdir /user/hive/z3
hadoop fs -put /tmp/data.txt /user/hive/z3
查看文件路径是否正确:
hadoop fs -ls /user/hive/z3/data.txt
分析:能用ls命令查到就可以一会使用这个路径了
使用load加载:
load data inpath '/user/hive/z3/data.txt' into table z3.mate;
使用的是绝对路径(HDFS中没有工作目录,所以没有相对路径的用法)
加载后查看:
hadoop fs -ls /user/hive/z3/
文件被移动走了,从原来的位置消失了
查看文件现在所处的位置:
desc formatted z3.mate
在其中找到路径这一行:
hadoop fs -ls /user/hive/warehouse/z3.db/mate
可以使用tail预览:
hadoop fs -tail /user/hive/warehouse/z3.db/mate/data_copy_1.txt
或者使用select查询数据:
可以发现,z3.mate表中一共有三个文件存储了3份同样的数据,使用select会从z3.mate对应的目录中读取所有数据文件,作为一个表来处理
注意使用正确的分区列和分区值
-- 分区表不存在的话先建上
create table if not exists z3.p_mate(
id int,
name string,
age int,
gender string,
birthday date
) comment '分区表'
partitioned by (month int)
row format delimited
fields terminated by ',';
样本数据还是使用/tmp/data.txt
,但是在加载数据时要指定分区列上的值:
load data local inpath '/tmp/data.txt'
into table z3.p_mate partition (month='10');
说明:这里采用了简化操作,将data.txt中的数据全部载入到10月的分区里面了,实际上需要根据生日分到对应的分区中进行存储
音乐榜单数据仓库中,尝试使用 ARRAY
来存储一首歌曲在多个榜单(例如日榜,周榜,月榜...)的排名,使用 MAP
来存储歌曲的其他属性,如歌手、发行年份等
定义数据表:
create database if not exists z3music;
use z3music;
drop table if exists music_charts;
create table music_charts (
song_id INT,
song_name STRING,
rankings ARRAY<INT>,
song_attributes MAP<STRING, STRING>
)
row format delimited
fields terminated by ','
collection items terminated by '|'
map keys terminated by ':'
stored as textfile;
分析:多个列之间用逗号,
分隔,集合内元素用竖线|
分隔,映射类型中键和值用冒号:
隔开
准备样本数据文件
vi music_chart_samples.txt
1,Happy Song,1|2|3,artist:Artist A|year:2020
2,Sad Song,4|5|6,artist:Artist B|year:2021
分析:这种表示方法中,只要遇到分隔符号就可以处理得到数据、映射等集合类型
除了使用分隔符号,也有其它的表示方法,例如数组值存储在方括号内,键值对存储在花括号内的情况,那么可以使用正则表达式进行处理
需要注意的是在加载这类有格式的数据时,以表定义中的数据类型为准,例如数组采用整型,那么这个位置如果出现了0-9数字以外的字符都会加载失败,那么这个位置上值为NULL。类似的,字符串的位置上如果是数字也会存为字符串的形式
准备好样本数据文件后,查看该文件的绝对路径:
readlink -f music_chart_samples.txt
那么接下来加载的时候可以用这个路径,或者将文件拷贝一份到/tmp目录下再继续
cp music_chart_samples.txt /tmp/music_chart_samples.txt
使用 load data
命令加载该文件到music_charts
表中:
load data local inpath '/tmp/music_chart_samples.txt'
into table z3music.music_charts;
完成加载后,查询数据表中的记录:
select * from z3music.music_charts;
查询某个属性,且该属性存储在MAP类型中,是否可以让这个属性作为二维表的列进行展示呢:
select song_name,
song_attributes['artist'] as artist,
song_attributes['year'] as year
from z3music.music_charts;
select查询里面给列取了别名,但是Hive命令行没有展示表头,所以建议使用beeline连接,可以展示表头并且绘制框线,连接语句是beeline -u jdbc:hive2:// -n scott -p tiger
也可以在浏览器中,登陆到Hue,执行select查询:
最后,ARRAY、MAP等复合数据类型常用的函数和操作符:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。