百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

HIVE内外部表与HQL 行列转换 hive内外部表的区别

wptr33 2024-11-11 16:08 28 浏览

Hive内部表与外部表的区别

内部表 (managed table) : 未被external修饰

外部表 (external table) :被external修饰

区别:

存储位置: 内部表的数据存储在Hive的默认文件系统中,而外部表的数据存储在外部文件系统中。外部文件系统可以是本地文件系统、HDFS等,这使得外部表可以方便地与其他系统进行数据共享和交互。

数据管理: 当删除内部表时,Hive会自动删除该表及其数据。而删除外部表时,只会删除表的元数据,而不会删除表的数据。这是因为内部表数据由Hive自身管理,外部表的数据并不是由Hive管理的(由HDFS管理),因此在删除外部表时需要手动清理数据。

表的创建方式:内部表可以通过CREATE TABLE语句进行创建,也可通过Hive自动将HDFS上的目录映射为表的方式进行创建。而外部表只能通过CREATE EXTERNAL TABLE语句进行创建。

数据导入:对于内部表,可以通过INSERT语句将数据导入到表中。而对于外部表,需要先将数据存储在外部文件系统中,然后通过LOAD DATA语句将数据加载到表中。

应用场景:

1)内部表适合存储对数据的修改和删除操作,因为删除内部表时可以直接删除相关的数据文件。一般内部表在数仓中的DW(细节层) 中使用;

2)外部表适合存储对数据的只读操作,比如将已经存在的数据文件导入到Hive中进行分析。一般外部表在数仓中的ODS层(贴源层) 中使用。


HQL 行列转换

1、行转列: UDF聚合函数

1) 相关函数

concat: 返回输入字符串连接后的结果,支持任意个输入字符串;

concat ws(separator, str1,str2,..: 它是一个特殊形式的 concat0;第一个参数传入参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

collect set(col): 函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

2) 数据准备

name

constellation

blood_type

小孙

白羊座

A

大海

射手座

A

小宋

白羊座

B

小八

白羊座

A

小风

射手座

A

3) 创建hive表并导入数据

create table person info(
  name string,
  constellation string,
  blood type string)
row format delimited fields terminated by "t";
load data local inpath "/opt/module/datas/constellation.txt" into table person info;

注:该表采用的是文本格式的数据文件,字段之间使用制表符 \t 进行分隔,因此在 create table 语句中使用了 row format delimited fields terminated by "\t" 来指定字段分隔符为制表符。其中 row format delimited 表示指定行的格式,fields terminated by "\t" 表示指定字段之间的分隔符为制表符。

接下来,使用 load data 语句将文本文件 /opt/module/datas/constellation.txt 中的数据导入到 person_info 表中。load data 语句用于将数据从外部存储器(如本地文件系统或 HDFS)导入到 Hive 表中。其中 local inpath 表示指定本地文件路径,/opt/module/datas/constellation.txt 是需要导入的文本文件的路径,into table 表示将数据导入到指定的表名 person_info 中。

需要注意的是,如果该表已经存在,则可以使用 insert into 语句将新数据插入到表中,或者使用 truncate table 语句清空表中的数据并重新导入数据。另外,在导入数据之前,需要确保表结构的定义与数据文件的格式相匹配,否则可能会导致数据导入失败或数据丢失等问题。

4)需求

把星座和血型一样的人归类到一起。结果如下:

射手座,A

大海|小风

白羊座,A

小孙|小八

白羊座,B

小宋

select name,concat(constellation, " ",blood type) as base from person_info;

select
	t1.base concat_ws ('|',collect_set ( t1.name )) name 
from
	( select name, concat( constellation, ",", blood type )  as  base from person_info; ) t1 
group by t1.base;

2、列转行: UDTF爆炸函数

1)相关函数

explode(col): 将hive一列中复杂的array或者map结构拆分成多行

lateral view

用法: lateral view udtf(expression) tableAlias AS columnAlias

解释: 用于和split,explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2)数据准备

movie

category

《战狼》

战争、灾难、动作

《疑犯》

动作、悬疑、剧情、科幻

《Life》

悬疑、警匪、心理、动作、剧情

3) 创建hive表并导入数据

create table movie_info(

movie string,

category array<string>)

row format delimited fields terminated by "t"
collection items terminated by ",";

load data local inpath "/opt/module/datas/movie.txt" into table movie_info

4) 需求

将电影分类中的数组数据展开

select movie,category name from movie_info
lateral view explode(category) table_category as category_name

相关推荐

Linux文件系统操作常用命令(linux文件内容操作命令)

在Linux系统中,有一些常用的文件系统操作命令,以下是这些命令的介绍和作用:#切换目录,其中./代表当前目录,../代表上一级目录cd#查看当前目录里的文件和文件夹ls#...

别小看tail 命令,它难倒了技术总监

我把自己以往的文章汇总成为了Github,欢迎各位大佬star...

lnav:基于 Linux 的高级控制台日志文件查看器

lnav是一款开源的控制台日志文件查看器,专为Linux和Unix-like系统设计。它通过自动检测日志文件的格式,提取时间戳、日志级别等关键信息,并将多个日志文件的内容按时间顺序合并显示,...

声明式与命令式代码(声明模式和命令模式)

编程范式中的术语和差异信不信由你,你可能已经以开发人员的身份使用了多种编程范例。因为没有什么比用编程理论招待朋友更有趣的了,所以这篇文章可以帮助您认识代码中的流行范例。命令式编程命令式编程是我们从As...

linux中的常用命令(linux常用命令和作用)

linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf...

如何限制他人操作自己的电脑?(如何控制别人的电脑不让发现)

这段时间,小猪罗志祥正处于风口浪尖,具体是为啥?还不知道的小伙伴赶紧去补一下最近的娱乐圈八卦~简单来说,就是我们的小罗同事,以自己超强的体力,以及超强的时间管理能力,重新定义了「多人运动」的含义,重新...

最通俗易懂的命令模式讲解(命令模式百科)

我们先不讲什么是命令模式,先通过一个场景来引出命令模式,看看命令模式能解决什么样的问题。现在有一个渣男张三,他有还几个女朋友,你现在是不是还是单身狗,你就说你气不气?然后他需要每天分别叫几个女朋友起床...

互联网大厂后端必看!Spring Boot 中Runtime执行与停止命令?

你是否曾在使用SpringBoot开发项目时,遇到需要执行系统命令的场景?比如调用脚本进行文件处理,又或是启动外部程序?很多后端开发人员会使用Processexec=Runtime.get...

Linux 常用命令(linux常用的20个命令面试)

日志排查类操作命令...

Java字节码指令:if_icmpgt(0xA3)(java字节码使用的汇编语言)

if_icmpgt是Java字节码中的一条条件跳转指令,其全称是"IfIntegerCompareGreaterThan"。它用于比较两个整数值的大小。如果栈顶的第一个...

外贸干货|如何增加领英的曝光量和询盘

#跨境电商#...

golang执行linux命令(golang调用shell脚本)

需求需要通过openssl生成rsa秘钥,然后保存该秘钥。代码实例packagemainimport("io/ioutil""bytes"&...

LINUX磁盘挂载(linux磁盘挂载到windows)

1、使用root用户查看磁盘挂载情况:fdisk-l2、使用df查看当前磁盘挂载情况,根据和fdisk-l的结果进行对比,查看还有那些磁盘未使用3、挂载:mount磁盘挂载路径...

Linux命令学习——nl命令(linux ln命令的使用)

nl命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...