Hive基础3

一、表的分区

大数据开发数据量较大,在进行数据查询计算时,需要对数据进行拆分,提升的查询速度

1-1 单个分区

单个分区是创建单个目录

-- 创建表指定分区,对原始数据进行分区保存
create table new_tb_user(
    id int,
    name string,
    age  int,
    gender int,
    create_time date
)partitioned by (gender_p int)
row format delimited fields terminated by ',';
​
select * from new_tb_user;
​
-- 将原始数据表的数据写入新的分区表中
-- 静态写入分区数据 需要手动自己指定分区数值
-- insert into new_tb_user partition(gender_p=0) select * from tb_user where gender=0
-- 动态写入分区数据
-- 可以指定一个字段数据,根据字段数据内容进行分区
set hive.exec.dynamic.partition.mode=nonstrict;
​
insert into new_tb_user partition(gender_p) select id,name,age,gender,create_time,gender from tb_user;
​
desc new_tb_user;
desc tb_user;

1-2 多个分区

多个分区可以将数据拆分多个目录存储

create table new2_tb_user(
    id int,
    name string,
    age  int,
    gender int,
    create_time date
)partitioned by (y string,m string,d string)
row format delimited fields terminated by ',';
​
select * from new2_tb_user;
insert into new2_tb_user partition(y,m,d) select id,name,age,gender,create_time,year(create_time),month(create_time),day(create_time) from tb_user  limit 10;
​

注意点

1-分组字段不能和表中字段重名

2-动态分区数据写入时,select中字段顺序要和分区表中字段顺序一致

3-分区字段是在最后,所以select中的分区数据指定也放在最后

1-3 分区的增删改查

-- 创建一个分区表
create table tb_student(
    id int,
    name string,
    gender string,
    age int,
    cls string
)partitioned by (cls_p string)
row format delimited fields terminated by ',';
​
-- show查看分区表的分区信息
show partitions tb_student;
​
-- 生成分区数据信息
-- 方式1 通过insert数据导入,生成对应的分区数据
-- 方式2 通过add方法直接指定分区,指定后会在对应表目录下生成分区目录
alter table tb_student add partition(cls_p='CS');
show partitions tb_student;
select * from tb_student;
​
-- 修改分区名
ALTER TABLE tb_student PARTITION(cls_p='CS') RENAME TO PARTITION(cls_p='CS2');
​
-- 删除分区
alter table tb_student drop partition(cls_p='CS')
​

二、表的分桶

分区 将数据拆分不同目录下存储

分桶 将数据拆分成不同文件进行存储

无论是分区,还是分桶,本质都是对数据的拆分存储,作用是为了提升查询的效率

2-1 分桶创建

使用分桶时,一般都是已经存在了一个原始数据表,为了提升原始数据速度,将原始数据在重新写入一个分桶表

create table tb_user_buckets(
      id int,
    name string,
    age  int,
    gender int,
    create_time date
)   -- clustered by 指定按照哪个字段的数据进行数据的拆分  into 2 buckets  指定拆分的数量
    clustered by(gender) into 2 buckets
row format delimited fields terminated by ',';
​
-- 将原始数据表的数据写入到分桶表
insert into tb_user_buckets select * from tb_user limit 100;
​
​
create table tb_user_buckets_new(
      id int,
    name string,
    age  int,
    gender int,
    create_time date
)   -- clustered by 指定按照哪个字段的数据进行数据的拆分  into 2 buckets  指定拆分的数量
    clustered by(gender) into 3 buckets
row format delimited fields terminated by ',';
​
insert into tb_user_buckets_new select * from tb_user limit 100;

2-2 分桶原理说明

数据按照hash取余的方式进行拆分,写入到不同的文件中

hash(分桶字段)%分桶数=余数

2-3 分桶主要使用场景

多表关联,为了提升多表关联的查询效率,可以将关联的表数据按照相同的关联字段,进行分桶,保持分桶个数一致,或是倍数关系,可以将系统数据放在同一个余数文件中,提升了关联效率


分桶还可以进行随机采样

可以通过随机采样减少计算量

三、数据的文件的读取和写入

hive在对hdfs上的文件数据进行读取和写入数据时,会调用的mapreudce的方法有两类

该方法叫做序列化器方法

 

如果使用delimited: 表示底层默认使用的Serde类:LazySimpleSerDe类来处理数据。

如果使用serde:表示指定其他的Serde类来处理数据,支持用户自定义SerDe类。

3-1 默认序列化器 delimited

在进行表定义时指定row format delimited

指定处理不同数据的方法

fields terminated by 字段的处理方法 指定如何分割字段
collection items terminated by  指定字段中数组的分割分割方式
map keys terminated by  指定map的数据分割方式

这几个方法主要对文件数据读取时,方便区分不同数据内容

I-array类型数据

对读取的数据中符合数组拆分数据转为数组

1,张三,篮球-足球,20
2,李四,羽毛球-乒乓球,20
-- 创建一个用户表
create table tb_user_new(
    id int,
    name string,
    hobby string,
    age int
)row format delimited
fields terminated by ',';
​
select * from tb_user_new;
-- 将兴趣字段 转为数组格式保存 [篮球,足球]
create table tb_user_new_array(
    id int,
    name string,
    hobby array<string>,
    age int
)row format delimited
fields terminated by ','-- 指定字段的分割符
collection items terminated by '-'; -- 指定字段中数组数据分割符
​
select * from tb_user_new_array;
II-struct类型数据
1,张三#20#男

1-先按照逗号拆分数据

2-在将张三#20#男 按照数组拆分 [张三,20,男]

3-在对数组中的数据转为map形式 {'name':张三,'age':20,'gender':男}

create table tb_user_new_struct(
    id int,
    `user` struct<name:string,age:int,gender:string>
)row format delimited
fields terminated by ','
collection items terminated by '#'; -- [张三,20,男]
​
select * from tb_user_new_struct;

 

III-map类型数据
1,孙悟空,53,西部大镖客:288-大圣娶亲:888-全息碎片:0-至尊宝:888-地狱火:1688
2,鲁班七号,54,木偶奇遇记:288-福禄兄弟:288-黑桃队长:60-电玩小子:2288-星空梦想:0
3,后裔,53,精灵王:288-阿尔法小队:588-辉光之辰:888-黄金射手座:1688-如梦令:1314
4,铠,52,龙域领主:288-曙光守护者:1776
5,韩信,52,飞衡:1788-逐梦之影:888-白龙吟:1188-教廷特使:0-街头霸王:888

1-按照field进行字段分割 分隔符是,

2-按照数组进行字段分割 分隔符是 - ['西部大镖客:288','大圣娶亲:888',全息碎片:0,至尊宝:888,地狱火:1688]

3-在将数组的key:value结构数据转为map {'西部大镖客':288,'大圣娶亲':888}

idnamebloodskin
1孙悟空53{'西部大镖客':288,'大圣娶亲':888}

3-2 自定义序列化器

可以使用自定义序列化器中提供jar包完成对json数据的处理

可以将json文件中的数据key最为字段,将value值解析为对应的行数据

{"movie":"1293","rate":"5","timeStamp":"978298261","uid":"2"}
-- {"movie":"1293","rate":"5","timeStamp":"978298261","uid":"2"}
create table tb_movie(
    movie string,
    rate string,
    `timeStamp` string,
    uid string
)row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'; -- 指定三方的序列化器 解析json文件
select * from tb_movie;

四、内置函数

是hive提供的函数方法,方便对不同类型的字段数据进行操作

4-1 字符串操作函数

  • 计算字符串长度

    • length(字段)

  • 字符串拼接

    • concat

    • concat_ws

  • 字符串切割

    • split(字段,'切割的字符')

  • 字符串截取

    • substr(create_time,起始的字符位置数,截取的字符个数)

  • 字符串替换

    • regexp_replace(字段,'原始字符','替换的新字符')

select * from tb_stu;
-- 计算字符串长度  统计字符个数
select name,length(name) from tb_stu;
-- 拼接多个字符换 没有拼接字符
select name,gender,concat(name,gender) from tb_stu;
select name,gender,concat_ws(':',name,gender) from tb_stu;
-- 切割 切割后的数据是数组
select create_time,split(create_time,'-') from tb_stu;
-- 数组取值
select create_time,split(create_time,'-')[0] from tb_stu;
-- 截取 取字符串中指定长度的字符数据
-- substr(create_time,起始的字符位置数,截取的字符个数)
select create_time,substr(create_time,1,4) from tb_stu;
-- 替换
select create_time,regexp_replace(create_time,'-','/') from tb_stu;
-- 方法嵌套使用
-- trim 去除字符串的前后空格   '  张三  '
select create_time,substr(trim(name),1,4) from tb_stu

4-2 数值操作函数

select 1+1;
select 1-1;
select 1*10;
​
select 2%5;
select round(3.12);
select round(3.1214,2);
select round(3.1294,2);
-- 向上取整数
select ceil(3.14);
-- 向下取整数
select floor(3.14);
-- 次方计算
select pow(2,3);

4-3 条件判断函数

-- if判断
-- if(判断条件,成立返回的结果,不成立返回的结果)  单个条件判断
select gender,if(gender=0,'男','女') from tb_user;
-- 多个分类条件判断 case when
-- 10-18 少年  18-40 青年  40-65 中年  大于 65 老年
select age,
       case
        when age <=18 then '少年'
        when age >18 and age <=40 then '青年'
        when age >40 and age <=65 then '中年'
        when age >65  then '老年'
        end as age_new
from tb_user;
-- 查看方法的使用形式
desc function extended nullif;
​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560988.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux嵌入式驱动开发-linux中断

文章目录 linux中断原理中断控制器GIC中断源分类 中断ID、中断线(中断号/中断源)中断ID中断线(中断号/中断源)MX6U中断源 上半部与下半部&#xff08;顶半部和底半部&#xff09;下半部实现机制linux软中断注册软中断触发软中断初始化软中断 taskletasklet_init&#xff1a;初始…

【AIGC】文本与音频生成引领行业革新

AIGC技术崛起 一、AIGC技术概述二、文本生成&#xff1a;结构化与创作型并进三、实例与代码解析四、音频生成&#xff1a;语音合成技术大放异彩五、结语 在科技的浪潮中&#xff0c;人工智能与大数据的结合不断推动着时代的进步。其中&#xff0c;AIGC&#xff08;Artificial I…

安居水站:水站经营秘籍:年入30万不是梦。水站创业指南。

在这个快节奏的社会里&#xff0c;初创企业家们总是在寻找一条明路&#xff0c;以在竞争激烈的市场中立足。为了帮助他们更好地实现这一目标&#xff0c;我根据经验决定制定一份水站经营指导手册。这份手册将详细阐述如何从零起步&#xff0c;如何运营&#xff0c;如何进行市场…

智慧浪潮下的产业园区:解读智慧化转型如何打造高效、绿色、安全的新产业高地

随着信息技术的飞速发展&#xff0c;智慧化转型已经成为产业园区发展的重要趋势。在智慧浪潮的推动下&#xff0c;产业园区通过集成应用物联网、大数据、云计算、人工智能等先进技术手段&#xff0c;实现园区的智慧化、高效化、绿色化和安全化&#xff0c;从而打造成为新产业高…

x-cmd ai | x openai - 用于发送 openai API 请求,以及与 ChatGPT 对话

介绍 Openai 模块是 Openai 大模型 Chatgpt 3 和 ChatGPT 4 命令行实现。x-cmd 提供了多个不同平台间多种 AI 大模型的调用能力。无论是本地模型还是 Web 服务上的模型&#xff0c;用户都可以在不同的 AI 大模型间直接无缝切换&#xff0c;并能把之前的聊天记录发送给新的大模…

【PCL】教程conditional_euclidean_clustering 对输入的点云数据进行条件欧式聚类分析...

[done, 3349.09 ms : 19553780 points] Available dimensions: x y z intensity 源点云 Statues_4.pcd 不同条件函数output.pcd 【按5切换到强度通道可视化】 终端输出&#xff1a; Loading... >> Done: 1200.46 ms, 19553780 points Downsampling... >> Done: 411…

【JavaWeb】Day50.Mybatis的XML配置文件

XML配置文件规范 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置文件中。 在Mybatis中使用XML映射文件方式开发&#xff0c;需要符合一定的规…

Nginx解决跨域访问难题:轻松实现跨域资源共享!

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 跨域资源共享&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;是一种网络浏览器的安全功能&#xff0c;它限制了一个源&#xff08;域、协议和端口…

学习空间转换-3D转换

1.什么是空间转换&#xff1f; 使用的是transform属性实现元素在空间内的位移&#xff0c;旋转&#xff0c;缩放等效果。 空间&#xff1a;是从坐标轴角度定义的。x,y,z三条坐标轴构成的一个立体空间&#xff0c;Z轴位置与视线方向相同。 所以空间转换也被叫做3D转换 语法&a…

docker+awk=无敌?!

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 dockerawk无敌&#xff1f;&#xff01; 前言需求分析容器间通过容器名称访问脚本实现一键部署命令解释 前言 当今软件开发的世界充满了数据&#xff0c;而 Docker 则是许多开发者首选的容器化解决方…

嵌入式学习55-ARM4(ADC和I²C)

1、什么是ADC,模拟量和数字量有什么特点&#xff1f; ADC&#xff1a; …

GhostNetV3:探索紧凑型模型的训练策略学习笔记

代码地址&#xff08;coming soon&#xff09;&#xff1a;Efficient-AI-Backbones/ghostnetv3_pytorch at master huawei-noah/Efficient-AI-Backbones GitHub 论文地址&#xff1a;2404.11202v1.pdf (arxiv.org) 紧凑型神经网络是专门为边缘设备上的应用而设计的&#xff0…

linux离线安装mysql

一、下载mysql 地址&#xff1a;MySQL 这里选择64为还是32为要根据操作系统来 uname -m 二、上传解压配置mysql 使用root账户登录linux服务器&#xff0c;在opt文件下创建mysql文件夹 cd /opt sudo mkdir mysql 使用Xftp上传mysql压缩包到此文件夹下(自行决定路径) cd mysql/…

Unity Editor编辑器扩展之创建脚本

前言 既然你看到这篇文章了&#xff0c;你是否也有需要使用代码创建脚本的需求&#xff1f;使用编辑器扩展工具根据不同的表格或者新增的内容去创建你想要的脚本。如果不使用工具&#xff0c;那么你只能不断去修改某个脚本&#xff0c;这项工作既繁琐也浪费时间。这个时候作为程…

蓝桥杯第十五界软件测试线下省赛题目分析及解决

PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试 题目1&#xff1a;功能测试 题目描述 ​ 某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如…

【介绍下LeetCode的使用方法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

1.为什么选择Vue框架

参考&#xff1a;百战程序员 为什么选择Vue框架 Vue是什么&#xff1f; 渐进式 JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以…

Lesson4--栈和队列

【本节目标】 1.栈 2.队列 3.栈和队列面试题 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &…

vue快速入门(三十五)组件通信-父传子

注释很详细&#xff0c;直接上代码 上一篇 新增内容 父组件传值子组件接收父组件传来的数据 源码 App.vue <template><div id"app"><!-- :item"item"为将item的值传递给MyTest组件 --><MyTest v-for"item in roles" :key&q…

【双曲几何】圆盘上的三角形概念

目录 一、说明二、对偶三角形概念2.1 反演关系2.2 对偶关系2.3 找出三角形的对偶三角形 三、正交三角形概念3.1 通过对偶三角形&#xff0c;找到垂心3.2 正交三角形的概念3.3 中心射影点的概念 四、后记 一、说明 本文对双曲空间的三角形进行分析&#xff0c;本篇首先给出&am…