hive 修改cluster by算法_疯狂Hive之DML操作(四)

article/2025/9/9 3:14:09

f10ee2e0d78a2c265954a19064332f5f.png

DML操作

Load

在将数据加载到表中时,Hive不会进行任何转换。加载操作是将数据文件移动到与Hive表对应的位置的纯复制、移动操作。

语法结构:

load data [local] inpath ‘filepath’ [overwrite] into table tablename [partition(par2=val1,par2=val2......)]

说明

1、filepath

相对路径:如project/data1

绝对路径:如/user/hive/project/data1

完整URI:如hdsf://namenode:9000/user/hive/project/data1

filepath可以引用一个文件(在这种情况下,Hive将文件移动到表中),或者它可以是一个目录(在这种情况下,Hive将把该目录中的所有文件移动到表中)

  1. Local

如果指定了local,load命令将在本地文件系统中查找文件路径

load命令会将filepath中的文件复制到目录文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置

如果没有指定local关键字,如果filepath指向的是一个完整的URI,Hive会直接使用这个URI.否则:如果没有指定schema或者authority,Hive会使用在hadoop配置文件中定义的schema和authority,fs.default.name制定了Namenode的URI

  1. Overwrite

如果使用了overwrite关键字,则目标表(或者分区)中的内容会被删除,然后再将filepath指向的文件或目录中的内容添加到表或者分区中

如果目标表(分区)已经有一个文件,并且文件名和filepath中的文件名冲突,那么现有的文件会被新文件所替代

Insert

Hive中insert主要是结合select查询语句使用,将查询结果插入到表中,例如:

insert overwrite table stu_buck

select * from student cluster by (sno);

需要保证查询结果的数目和需要插入数据表格的列数目一致

如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但还是不能保证装换一定成功,转换失败的数据将会为null

可以将一个查询出来的数据插入到原表中,结果相当于自我复制了一份数据。

Multi inserts多重插入

form source_table

insert overerite table tablename1 [partition (par1=val1,par2=val2.......)]

select_statement1

insert overerite table tablename2 [partition (par1=val1,par2=val2.......)]

select_statement1.....

多重插入

创建三张表,如下

create table source_table (id int,name string) row format delimited fields terminated by ',';

create table test_insert1(id int) row format delimited fields terminated by ',';

create table test_insert2(name string) row format delimited fields terminated by ',';

aa90c20211a907dc92de4ad37c505515.png

给source_table创建数据,新建文件source.txt,在文件中编写如下数据

c26a918ea6b0397a816c39b4029e3676.png

加载数据

命令:load data local inpath '/root/hivedata/source.txt' into table source_table;

d38add01d456995ab4b0a8478ee517e0.png

执行多重插入

from source_table

insert overwrite table test_insert1

select id

insert overwrite table test_insert2

select name;

b33f8718a4e55be6e22bd07d982c4123.png

Dynamic partition inserts动态分区插入

语法:insert overwrite table tablename partition (par1=val1,par2=val2......) select_statement from from_statement;

动态分区是通过位置来对应分区值的。原始select出来的值和输出partition的值的挂你仅仅是通过位置来确定的,和名字并没有关系

动态分区插入

set hive.exec.dynamic.partition=true; #是否开启动态分区功能,默认是false关闭

set hive.exec.dynamic.partition.mode=nonstrict; #动态分区模式,默认是static,表示必须指定至少一个动态分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区

需求

将dynamic_partition_table中的数据按照时间(day),插入到目标表d_p_t的相应分区中

原始表

create table dynamic_partition_table (day string,ip string) row format delimited fields terminated by ',';

数据信息

2020-05-10,ip1

2020-05-10,ip2

2020-05-12,ip3

2020-05-12,ip4

2020-06-13,ip3

2020-06-14,ip1

2020-06-15,ip2

load data local inpath '/root/hivedata/dynamic_partition_table.txt' into table dynamic_partition_table;

8211dc8a006e50d489ed072d35824d46.png

目标表

create table d_p_t(ip string) partitioned by (month string,day string);

动态插入

insert overwrite table d_p_t partition (month,day)

select ip,substr (day,1,7) as month,day

from dynamic_partition_table;

6281f585b7fcb1a7efd9fd6c6e70a132.png

导出表数据

语法结构:

insert overwrite [local] directory directory1 select.....form.....

multiple inserts:

from form_statement

insert overwrite [local] directory directory1 select_statement1

[insert overwrite [local] directory directory1 select_statement1].....

数据写入到文件系统时进行文本序列化,且每列用^A来区分,n为换行符

查询结果导出到文件系统

将查询的结果保存到指定的文件目录(可以是本地,也可以是HDFS)

需求:将Hive中source_table中数据导入到node01上的hive目录下

创建hive目录:mkdir hive

e52723504f1cb498b83cfa3eec85890c.png

insert overwrite local directory '/root/hive'

select * from source_table;

执行完成查看是否有数据导出

046f69699ce740d9dfd1028b8fd1f3d3.png

需求:将Hive中source_table中数据导入到HDFS上的gw目录下

insert overwrite directory '/gw'

select * from source_table;

执行完成查看是否有数据导出

2df24af72c463ac6e1d81761c43a2807.png

Select

基本的select操作

语法结构

Select [all | distinct] select_expr,select_expr,.....

Form table_reference

Join table_other on expr

[where where_condition]

[group by col_list[having condition]]

[cluster by col_list

| [distribute by col_list] [sort by | order by col_list]

]

[limit number]

说明:

  1. order by会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大 时,需要较长的计算时间
  2. sort by 不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by 进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的 输出有序,不保证全局有序
  3. Distrubute by(字段) 根据指定字段将数据分到不同的reducer,分发算法是 hash散列。
  4. Cluster by(字段) 除了具有distribute by的功能,还会度该字段进行排序。

如果distribute和sort的字段是用一个时,此时,cluster by = distribute by + sort by

分桶、排序查询

select * from student cluster by(sno);

如下语句会报错,应为cluster和sort不能共存

select * from student cluster by(sno) sort by (sage asc);

对某列进行分桶的同时,根据另一个进行排序

select * from student distribute by(sno) sort by(sage asc);

总结

cluster(分且排序,必须一样)==distribute(分) + sort(排序)(可以不一样)

Hive join操作

Hive中除了支持和传统数据库中一样的内关联、左关联、右关联、全关联,还支持left semi join 和cross join,但是两种join类型也可以用前面的代替

Hive支持等值连接(a.id=b.id),不支持非等值(a.id>b.id)的连接,因为非等值连接非常男转化到map/reduce任务。另外,Hive支持多2个以上表之间的join

写join查询时,需要注意一下几点:

join时,每次map/reduce任务的逻辑

Reduce会缓存join序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统。这一实现有助于在reduce端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则或因为缓存浪费大量内存)

left,right和full outer关键字用于处理join中空记录的情况

对应所有a变中的记录都有一条记录输出。输出的结果应该是a.val,b.val,当a.key=b.key时,而当b.key中找不到等值的a.key记录时也会输出:

a.val,null

所以a表中的所有记录都被保留了

a right outer join b 会保留所有b表的记录

准备数据

a表数据

1,a

2,b

3,c

4,d

7,y

8,u

b表数据

2,bb

3,cc

7,yy

9,pp

建表

create table a(id int,name string) row format delimited fields terminated by ',';

create table b(id int,name string) row format delimited fields terminated by ',';

导入数据

load data local inpath '/root/hivedata/a.txt' into table a;

load data local inpath '/root/hivedata/b.txt' into table b;

实验

设置Hive本地模式执行,提高执行效率

set hive.exec.mode.local.auto=true;

内关联:inner join

select * fro a inner join b on a.id = b.id

左关联:left join

select * from a left join b on a.id=b.id;

右关联:right join

select * from a right join b on a.id=b.id;

全关联:full outer join

select * from a full outer join b on a.id=b.id;

Hive中的特别join

select * from a left semi join b on a.id=b.id

6572fd77de0ed897f73f57f4995c9b01.png

http://chatgpt.dhexx.cn/article/7Ykn7nQb.shtml

相关文章

RT-Thread Studio学习(十一)IIC

RT-Thread Studio学习(十一)IIC 一、简介二、新建RT-Thread项目并使用外部时钟三、设置AT24Cxx的驱动框架四、驱动代码移植五、测试六、总结 一、简介 本文将基于STM32F407ZGT芯片介绍如何在RT-Thread Studio开发环境下访问AT24C256模块。 操作系统&am…

从根上理解操作系统(二)

目录 进程 1、进程到底是什么 2、怎么知道时间片用完的 3、进程切换 4、进程初始化 5、任务堆栈 6、系统调用 进程 程序是一个可执行文件,而进程是一个执行中的程序实例,所以可以认为 进程 进程资源 执行序列 利用分时技术,在操作系统…

【ubuntu18.04】meson 安装 及python升级python3.9

发现openh264 支持meson 发现openh264 支持meson 写的也太简单了完全不知道openh264 到底怎么搞meson看起来支持windows和ubuntu先安装python3 参考大神: 注意:meson安装前必须确认是否已经安装python3.5及以上版本;因为meson依赖于python3和ninja 1 安装python3和ninja:su…

KEAZ128 时钟配置

本文介绍如何用KEAZ128评估版(FRDM-KEAZ128Q80)配置为40MHz core freqency/20MHz bus frequency。 1.了解器件时钟特性 参见NXP KEA128 DS(S9KEA128P80M48SF0.pdf ),可以知道这个MCU最高支持48MHz core frequency. 从KEA128 RM&…

《软件工程》整理

目录 Scrum开发 概念 scrum开发流程 Scrum开发 需求获取(拆分) DevOps Server的CMMI模型对需求的层级划分,Epic(长篇故事)、Feature(特性)、Requirement(需求)其中&am…

RTKLIB源码调试.trace文件解析.stat文件解析

.trace文件是调试文件,帮助用户在程序、输入数据时,进行分析的一个很好的提示! .trace文件的生成、trace文件内容的生成,均在execses中! 以单点定位为例,大体流程为: 生成.trace文件&#xf…

sopt:一个简单的python最优化库

sopt:一个简单的python最优化库引言 最近有些朋友总来问我有关遗传算法的东西,我是在大学搞数学建模的时候接触过一些最优化和进化算法方面的东西,以前也写过几篇博客记录过,比如遗传算法的C语言实现(一):以非线性函数求极值为例和C语言实现粒子群算法(P…

python古诗词生成_Python一日一练02----诗词生成器

要求 编写一段程序,可以自动生成小诗。 格式如下 源码 import random import sys articles ["the", "a", "another", "her", "his"] subjects ["cat", "dog", "horse", "m…

LSTM古诗词生成

Le LSTM古诗词生成 一、简介 基于LSTM的古诗词生成,设计神经网络模型,使模型学习数据是6291首古诗,没有专门的验证数据和测试数据,感觉不会预测正确。边学习边生成古诗,从生成的古诗来看学习的效果。 涉及到的模块有Py…

宋词自动生成

利用宋词语料库,通过单双词的组合与模板的匹配,实现指定词牌宋词的生成 import random import tkinter as tk import re from tkinter import messageboxlist []class Window:# 界面设计def __init__(self, root):label1 tk.Label(root, text输入词牌…

基于Python的宋词生成器

资源下载地址:https://download.csdn.net/download/sheziqiong/85631523 1. 背景 我有两个爱好,一个是传统文化,另一个是高新技术。 传统文化,我喜欢唐诗宋词、笔墨丹青,高新技术我则从事前沿的IT编程,喜…

基于java的古诗词生成管理系统

10161-古诗词生成管理系统 开发工具 eclipse tomact mysql jdk 功能详情: 古诗搜索、古诗问答、机器回复、古诗管理(添加古诗、古诗分类、古诗标签、古诗列表)、用户管理

田字格字帖生成器、孩子取名系列工具

大家好,我是小寻,欢迎关注公众号:工具优选,免费领取优质项目源码和常用工具,还可以加入我的交流群! 这是是一款2013年上线的在线小工具集,包括了 13 款中文学习工具,有田字格字帖、拼音田字格、古诗词字帖…

有趣的深度学习——使用TensorFlow 2.0 + RNN 实现一个古体诗生成器

一、前言 很早之前,我曾经写过一个古体诗生成器(详情可以戳TensorFlow练手项目二:基于循环神经网络(RNN)的古诗生成器),那个时候用的还是Python 2.7和TensorFlow 1.4。 随着框架的迭代,API 的变更&#x…

现在还可以一键自动生成古诗词,你知道吗?

人类在漫长的历史长河中,一直在探索着各种各样的美好,不断地追求着更高的境界。而如今,随着科技的不断发展,人工智能已经成为了我们得力的伙伴之一,为我们带来了更多的便利和可能性。尤其是在艺术和文化领域&#xff0…

古诗词在线起名 - 一刀工具箱

古诗词名字生成器帮助你在线生成古诗词名字,包含:诗经、楚辞、唐诗、宋词、辞赋等古风的名字,这些名字都非常的优美好听,希望你们能够喜欢这款古诗词起名工具。 代码片段 async subName() {let name_arr Object.keys(this.userN…

NLP入门 - 基于Word Embedding + LSTM的古诗生成器

一共实现三个功能: 1. 续写五言诗 2. 续写七言诗 3. 写五言藏头诗 之前用这个做Intro to Computer Science的期末项目折腾太久,不想赘述,内容介绍及实现方法可参考期末presentation的slides: https://docs.google.com/presen…

基于古诗词的名字生成器

数据集 因为数据量庞大,使用本地的 CSV 数据进行测试。 后续改进 CSV 文件保存到 mongodb 数据库,便于聚合查询。 数据分词 我们需要一个分词器将这些数据进行分词,用到的是 Golang 版的 jieba 库如下: "github.com/go-e…

基于LSTM + keras 的古诗生成器

1.语料准备:包含 5.5 万首唐诗、26 万首宋诗、2.1 万首宋词和其他古典文集。诗人包括唐宋两朝近 1.4 万古诗人,和两宋时期 1.5 千古词人。数据来源于互联网。每行一首诗,标题在预处理的时候已经去掉了。2.模型参数配置:预先定义模…

唐诗生成器

使用唐诗语料库,经过去噪预处理、分词、生成搭配、生成主题等过程,生成唐诗。 csdn下载地址:http://download.csdn.net/detail/lijiancheng0614/9840952 github上repository地址:https://github.com/lijiancheng0614/poem_genera…