前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive加载数据、使用复合数据类型

Hive加载数据、使用复合数据类型

原创
作者头像
esse LL
修改2024-03-27 21:45:01
2700
修改2024-03-27 21:45:01
举报
文章被收录于专栏:操作系统实验

Hive数据仓库中加载数据文件,使用HDFS管理数据文件,使用数组、映射数据类型存储数据

1.使用load加载

在本地数据创建数据文件:

代码语言:bash
复制
vi /tmp/data.txt
代码语言:plaintext
复制
1,jack nn,25,男,1995-01-01
2,jerry ss,30,女,1990-05-10
3,joker dd,35,男,1985-10-23

在Hive中新建表:

代码语言:sql
复制
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表中:

代码语言:sql
复制
load data local inpath '/tmp/data.txt' into table z3.mate;

分析:加载本地文件需要加上local选项

完成加载后查询:

代码语言:sql
复制
use z3;
select * from mate;

查看文件的绝对路径

从本地文件系统加载数据一般使用/开头的绝对路径,快速得到某个文件的绝对路径可以使用readlink -f或者locate命令

在HDFS中查看数据文件

加载到Hive数据仓库以后,数据文件会保存在默认存储位置,一般不经过额外设置是/user/hive/warehouse这个路径,要查看这个路径,需要使用HDFS的命令

代码语言:bash
复制
hadoop fs -ls /user/hive/warehouse

在使用HDFS文件系统时,使用hadoop fshdfs dfs效果是一样的,只是写法不一样

估算文件大小:

代码语言:bash
复制
hadoop fs -ls /user/hive/warehouse/z3.db/mate

86字节换算过来是 \frac{86}{1024} \approx 0.08 KB

2.预览数据文件

HDFS中可以使用-cat选项在屏幕上打印所有的内容,或者使用 -tail选项查看最近一次追加到文件内的行

一般常用的就是tail命令了,不过只能看最后1KB的文本内容,但是会比cat一次性打出所有内容方便一些

代码语言:bash
复制
hadoop fs -tail /user/hive/warehouse/z3.db/mate/data.txt

如果要查看文件的头几行,可以组合使用HDFS中的cat和(Linux自带的)more命令,用法如下:

代码语言:bash
复制
hadoop fs -cat /user/hive/warehouse/z3.db/mate/data.txt | more # 在两个命令中间加上管道符|

3.使用相对路径

使用相对路径时需要根据当前工作目录来确定路径

查看目前的工作目录

代码语言:sql
复制
-- Hive中使用叹号开头表示执行Linux Shell命令,且命令要以分号结尾;
!pwd;

使用相对路径查看文件:

代码语言:sql
复制
!cp /tmp/data.txt ./d2.txt;
!ls ./d2.txt;

这个过程是将数据文件拷贝到当前工作目录下的d2.txt,用于跟之前的data.txt进行区分

使用相对路径加载文件

代码语言:sql
复制
load data local inpath './d2.txt' into table z3.mate;

查看该数据文件:

代码语言:bash
复制
hadoop fs -ls /user/hive/warehouse/z3.db/mate/

4.从HDFS加载数据

先将数据从本地传到HDFS

代码语言:bash
复制
hadoop fs -mkdir /user/hive/z3
hadoop fs -put /tmp/data.txt /user/hive/z3

查看文件路径是否正确:

代码语言:bash
复制
hadoop fs -ls /user/hive/z3/data.txt

分析:能用ls命令查到就可以一会使用这个路径了

使用load加载:

代码语言:sql
复制
load data inpath '/user/hive/z3/data.txt' into table z3.mate;

使用的是绝对路径(HDFS中没有工作目录,所以没有相对路径的用法)

加载后查看:

代码语言:bash
复制
hadoop fs -ls /user/hive/z3/

文件被移动走了,从原来的位置消失了

查看文件现在所处的位置:

代码语言:sql
复制
desc formatted z3.mate

在其中找到路径这一行:

代码语言:bash
复制
hadoop fs -ls /user/hive/warehouse/z3.db/mate

可以使用tail预览:

代码语言:bash
复制
hadoop fs -tail /user/hive/warehouse/z3.db/mate/data_copy_1.txt

或者使用select查询数据:

可以发现,z3.mate表中一共有三个文件存储了3份同样的数据,使用select会从z3.mate对应的目录中读取所有数据文件,作为一个表来处理

5.加载到分区表

注意使用正确的分区列和分区值

代码语言:sql
复制
-- 分区表不存在的话先建上
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,但是在加载数据时要指定分区列上的值:

代码语言:sql
复制
load data local inpath '/tmp/data.txt' 
into table z3.p_mate partition (month='10');

说明:这里采用了简化操作,将data.txt中的数据全部载入到10月的分区里面了,实际上需要根据生日分到对应的分区中进行存储

6.补充练习:加载数组或者映射类型数据

音乐榜单数据仓库中,尝试使用 ARRAY 来存储一首歌曲在多个榜单(例如日榜,周榜,月榜...)的排名,使用 MAP 来存储歌曲的其他属性,如歌手、发行年份等

step1

定义数据表:

代码语言:sql
复制
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;

分析:多个列之间用逗号,分隔,集合内元素用竖线|分隔,映射类型中键和值用冒号:隔开

step2

准备样本数据文件

代码语言:bash
复制
vi music_chart_samples.txt
代码语言:plaintext
复制
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。类似的,字符串的位置上如果是数字也会存为字符串的形式

准备好样本数据文件后,查看该文件的绝对路径:

代码语言:bash
复制
readlink -f music_chart_samples.txt

那么接下来加载的时候可以用这个路径,或者将文件拷贝一份到/tmp目录下再继续

代码语言:bash
复制
cp music_chart_samples.txt /tmp/music_chart_samples.txt

使用 load data 命令加载该文件到music_charts 表中:

代码语言:sql
复制
load data local inpath '/tmp/music_chart_samples.txt' 
into table z3music.music_charts;

step3

完成加载后,查询数据表中的记录:

代码语言:sql
复制
select * from z3music.music_charts;

查询某个属性,且该属性存储在MAP类型中,是否可以让这个属性作为二维表的列进行展示呢:

代码语言:sql
复制
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等复合数据类型常用的函数和操作符:

  • size(array):返回数组的长度
  • array_contains(array, value):判断数组是否包含某个值
  • map_keys(map):返回map中的所有键组成的集合
  • map_values(map):返回map中的所有值组成的集合
  • get(map, key):通过键获取map中的值

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hive数据仓库中加载数据文件,使用HDFS管理数据文件,使用数组、映射数据类型存储数据
    • 1.使用load加载
      • 查看文件的绝对路径
      • 在HDFS中查看数据文件
    • 2.预览数据文件
      • 3.使用相对路径
        • 查看目前的工作目录
        • 使用相对路径加载文件
      • 4.从HDFS加载数据
        • 5.加载到分区表
          • 6.补充练习:加载数组或者映射类型数据
            • step1
            • step2
            • step3
        相关产品与服务
        腾讯云数据仓库 TCHouse
        腾讯云数据仓库 TCHouse 是腾讯云基于开源引擎打造的一系列企业级托管型云数仓产品,兼备稳定性、安全性的同时提供高效的自主运维工具和自主开发环境等配套设施。满足用户不同业务数据仓库场景的方案选型,提升用户分析查询效率、赋能用户数据价值。产品服务覆盖移动互联、广告、银行、保险、游戏、教育、地图等客户场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档