hadoop大数据平台操作笔记(上)

Hadoop介绍

Hadoop是一个开源的分布式系统框架,专为处理和分析大规模数据而设计。它由Apache基金会开发,并通过其高可靠性、高扩展性、高效性和高容错性等特性,在大数据领域发挥着重要作用。以下是对Hadoop的详细解释及其用途的概述:

Hadoop是什么

  • 定义:Hadoop是一个开源的分布式计算平台,它通过将数据分布式存储在多台服务器上,并使用MapReduce等算法进行数据处理,从而实现高效的数据存储和处理。
  • 核心组件:Hadoop主要由HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)和MapReduce组成。HDFS提供高容错性的分布式存储解决方案,而MapReduce则是一个用于大规模数据处理的并行计算框架。
  • 生态系统:Hadoop的生态系统还包括YARN(Yet Another Resource Negotiator,另一种资源协调者)、Zookeeper等组件,以及Hive、HBase、Spark等多个工具,这些工具和组件共同构成了Hadoop强大的数据处理和分析能力。

Hadoop的用途

  • 大数据存储:Hadoop通过其分布式文件系统HDFS,能够支持PB级的数据存储,并且提供高吞吐量的数据访问能力,非常适合存储大规模数据集。
  • 数据处理与分析:Hadoop的MapReduce框架使得大规模数据处理变得简单高效。用户可以通过编写MapReduce程序来处理和分析存储在HDFS上的数据,从而挖掘出有价值的信息。
    日志处理:Hadoop擅长处理和分析日志数据。企业可以利用Hadoop来收集、存储和分析大量的日志文件,以监控系统的运行状态、识别潜在的问题并进行优化。
  • ETL(Extract, Transform, Load):Hadoop可以用于数据抽取、转换和加载的过程。企业可以将不同来源的数据抽取到Hadoop中,然后进行清洗、转换和加载到目标数据库或数据仓库中。
  • 机器学习:Hadoop的生态系统中的Mahout等工具支持机器学习算法,使得企业可以在Hadoop平台上进行机器学习模型的训练和预测。
  • 搜索引擎:Hadoop可以与Lucene等搜索引擎技术结合使用,构建高性能的搜索引擎系统,用于处理大规模的搜索请求和数据。

操作Hadoop

·Hadoop的服务是以集群的方式存在的。整个平台在项目中是由多个服务器共同组网构成,
Hadoop的安装有三种模式

  • 单机版(Standalone Mode)
    • 特点:
      • Hadoop默认的安装模式。
      • 所有的服务和数据处理都在同一台机器上进行,不与其他节点交互。
      • 不使用Hadoop文件系统(HDFS),直接在本地操作系统的文件系统上读写数据。
      • 不加载任何Hadoop的守护进程。
      • 主要用于开发和调试MapReduce应用程序。
    • 配置:
      • 通常不需要修改配置文件,安装后即可使用。
      • 主要配置可能涉及设置JAVA_HOME环境变量,以确保Hadoop能够找到Java运行环境。
  • 伪分布式(Pseudo-Distributed Mode)
    • 特点:
      • 在一台机器上模拟分布式环境,所有Hadoop的守护进程(NameNode、DataNode、ResourceManager、NodeManager等)都运行在同一台机器上。
      • 具备Hadoop的所有功能,如HDFS、YARN等。适用于学习、开发和小规模实验。
    • 配置:
      • 需要修改Hadoop的配置文件,如core-site.xml、hdfs-site.xml、mapred-site.xml(或mapred-default.xml的副本)、yarn-site.xml等。
      • 配置文件中需要设置HDFS的NameNode和DataNode的地址、端口,以及YARN的ResourceManager和NodeManager的配置。
      • 可能还需要配置SSH免密登录,以便Hadoop守护进程之间可以相互通信。
  • 完全分布式模式(Fully-Distributed Mode)
    • 特点:
      • Hadoop集群由多台机器(节点)组成,各节点通过网络互联。
      • 每个节点上运行不同的Hadoop守护进程,共同协作完成数据处理任务。
      • 适用于生产环境,可以处理大规模数据。
    • 配置:
      • 配置过程相对复杂,需要设置每个节点的角色(如NameNode、DataNode、ResourceManager、NodeManager等)。
      • 需要配置Hadoop的配置文件,包括core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml等。
      • 配置文件中需要设置HDFS的NameNode和DataNode的地址、端口,以及YARN的ResourceManager和NodeManager的配置。
      • 还需要配置slaves文件(或类似的文件),列出所有DataNode和NodeManager节点的地址。
      • 配置SSH免密登录,以便各节点之间可以相互通信。
      • 在主节点上启动Hadoop集群,然后验证各节点的服务状态。

Hadoop的文件夹结构和文件功能

  • sbin:存放所有的Hadoop管理相关脚本文件的文件夹
    • start -all.sh:开启所有服务
    • start-dfs,sh:开启文件管理服务
    • start-yarn.sh:开启资源管理服务
  • etc/hadoop:存放所有配置文件的文件夹
    • core-site.xml:核心站点的配置
    • hdfs-site.xml:文件系统的配置
    • yarn-site.xml:资源管理系统的配置
    • mapred-site.xml:计算引擎的配置

伪分布式安装Hadoop的示例:

  • 修改文件系统,让系统不仅可以本地访问,也可以用于局域网的访问:
    • 修改core-site.xml文件的地址配置信息
    vim /home/hadoop-3.2.1/etc/hadoop/core-site.xml
    
    将localhost本地的地址先改成局域网的ip地址:
    在这里插入图片描述
    • 重新格式化文件系统的内容
    hdfs namenode -format
    
    • 现在我们需要去同步hdfs文件系统中数据的版本
 可以通过 /home/hadoop-3.2.1/etc/hadoop/hdfs-site.xml 文件,查看namenode和datanode两个服务的地址:

在这里插入图片描述
- 先查看 namenode 服务中的版本号:

cat  /home/root/tmp/data/hadoop/dfs/name/current/VERSION```

在这里插入图片描述
- 修改 datanode 服务中的版本号:

vim  /home/root/tmp/data/hadoop/dfs/data/current/VERSION
发现这里的clusterID和上面的不一样,修改成和上面的id相同的值即可。

在这里插入图片描述
- 启动完整的hadoop的服务,查看启动是否正常
/home/hadoop-3.2.1/sbin/start-all.sh
使用 jps 命令来查看启动的信息:显示的是hadoop服务的进程编号和名字
在这里插入图片描述

hadoop的基础服务

在hadoop的平台中,有三大基础服务:
– HDFS:hadoop里面的分布式文件管理系统
– YARN:资源管理系统
– MAPREDUCE:计算引擎

HDFS

–通过浏览器来查看hdfs的界面和内容:192.168.222.132:50070。
–在hdfs中创建的内容,在Linux中是看不见的,他们是两套不同的系统。

HDFS命令

命令说明
创建文件夹hadoop fs -mkdir -p 文件夹位置和名字
给文件夹赋予权限hadoop fs -chmod -R 要给的权限 文件或者文件夹的名字和位置
创建文件hadoop fs -touch(z) 文件位置和名字
删除文件或文件夹hadoop fs -rm -r 文件路径(不需要f,hdfs默认强制删除)
将Linux系统中的文件上传到hdfs系统中hadoop fs -put linux的文件路径 hdfs的目标路径
将hdfs的文件下载到Linux中hadoop fs -get hdfs中文件路径 Linux目标路径
将Linux本地文件的内容,上传合并到hdfs已存在文件hadoop fs -appendToFile linux的文件位置 hdfs文件位置
查看hdfs文件的内容hadoop fs -cate hdfs文件路径
查看文件大小hadoop fs -du -s -h hdfs文件或文件夹路径

HDFS的三个服务

NameNode

名称节点,直接和客户端进行数据交互,验证数据交互的过程;保存所有数据的元数据信息。
什么是元数据
对于数据内容的解释以及结构的定义。如果数据是一个表格,那么元数据就是表格的名字、位置、字段名、字段的数据类型等信息。

DataNode

数据节点,进行数据的保存和写入

SecondaryNameNode

辅助名称节点,扫描整个服务器节点的信息,将数据的信息内容复制到NameNode保存起来。

面试常问

hdfs写入数据的流程
在这里插入图片描述
rack:架子

  1. 客户端向NameNode发送写入数据的申请
  2. NameNode校验数据是否符合规则(是否重名,路径是否存在)
  3. NameNode同意申请
  4. 客户端向NameNode发送获得能够写入数据的DataNode节点的列表信息的请求
  5. NameNode发送DataNode节点列表
  6. 客户端根据Linux的管道技术,找到离自己最近的rack上的DataNode然后发送写入数据的申请
  7. DataNode发送同意的回应
  8. 客户端发送数据(DataNode收到数据同时复制两份分别发送到同一rack和不同rack的DataNode中进行备份)
  9. DataNode回复写入完成

HDFS读取数据的流程
在这里插入图片描述

  1. 客户端发送带有文件路径path的访问请求
  2. NameNode返回有这个文件的DataNode节点信息列表
  3. 客户端申请读取数据
  4. 返回同意读取
  5. 客户端申请要读取的数据的数据块信息
  6. DataNode返回相应数据

注:
HDFS的写入过程中,数据是默认保存3份的,这个存储的备份数量是可以自己定义的:
/home/hadoop-3.2.1/etc/hadoop/hdfs-site.xml
在这里插入图片描述

BLOCK SIZE:hdfs的数据块的大小,128M。定义的我们数据文件每次传输的最大值。
如果有一个文件是300M,这个文件会拆分成3个block,分别是128 128 44 M三个块,每次传输只写入其中一个block。

MAPREDUCE

MapReduce是hadoop平台的默认的计算引擎,除了mr还有spark、tez、flink … 等不同的计算引擎。
计算引擎在我们的工作过程中,是通过sql语句等完成自动的调用的。

步骤说明
input读取器数据
split拆分数据
map映射数据
shuffle计算数据
reduce汇总数据
finalized展示数据

在这里插入图片描述

YARN

yarn是Hadoop平台的资源管理系统,由两个基础服务组成:

  1. ResourceManager:
    资源管理器,负责资源的申请和管理
  2. NodeManager:
    节点管理器,负责资源的下放和回收

在这里插入图片描述

HIVE数据库的操作

hive只是一个写sql的窗口而已,元数据的存储是通过 derby 或者 mysql 进行存储的,表格的数据存储在hdfs中,数据的计算是用mapreduce来实现的。

hive的操作有三个基本的窗口:

  1. webUI:通过浏览器的组件去操作hive数据库,例如hue
  2. jdbc:通过各种客户端的软件来操作的,例如dbeaver
  3. CLI:命令行的操作方法,例如直接通过xshell的命令窗口来操作数据库

库的操作

在Hive中,有一个默认的数据库,叫做default。我们也可以自己去创建和删除数据库。
default库的位置是 /user/hive/warehouse 整个文件夹。

创建一个数据库

语法:create database dbName;
**注:**数据库在hdfs中以文件夹的方式存在。位置在 /user/hive/warehouse

查看有哪些数据库

show databases;

删除数据库

drop database dbName;
drop database abName cascade;
如果你的数据库已经创建了表格,不是空库了,就只能通过cascade选项强制删除

使用和切换数据库

use dbName;

显示数据库名字(可选)

set hive.cli.print.current.db=true;
这个参数的默认值是false,我们给它修改成true即可。

如果想要参数永久的有效,需要去修改hive数据库的配置文件:
vim /home/apache-hive-3.1.2-bin/conf/hive-site.xml

表格的操作

创建表格的基础语法:

create  table  表名(
列名  数据类型
);

数据类型

  • 简单类型
    • 数字类型:整数 int bigint;小数 float,double(默认形式),decimal(总长度,精度)
    • 字符串类型:定长字符串 char;不定长字符串 varcahr;无限制字符串 string
    • 日历类型:年月日时分秒毫秒 date。注:在hive中一般不用date定义时间,通常用string保存,方便不同数据库交换数据
  • 复杂类型
    • 数组array
      一个数组里只能存放相同类型的数据。array<数据类型>
    • 映射类型:map
      存放键值对类型的数据,所有的key和所有的value类型必须是同种类型。map<key类型,value类型>

向表格中插入数据

  • 只有简单数据
insert into tabname(cloumnname) values(value);
  • 有复杂类型的插入
insert into 表名(列名) select 查询语句insert into users select 1002,'bb','18898765432',
array('吃饭','睡觉','玩游戏'),
map('语文',88,'数学',72);

如果操作的数据整体的数据量是小于128M,那么可以使用Hive的本地模式去运行:(速度会快点)
set hive.exec.mode.local.auto=true;

表格的分隔符信息

默认的分隔符有三种,分别是:
字段的分隔符:^A,在数据库里面的编码内容是 \001,使用ctrl+v+a才能打印这个符号
元素之间的分隔符:^B,在数据库里面的编码内容是 \002,使用ctrl+v+b才能打印这个符号
键值对之间的分隔符:^C,在数据库里面的编码内容是 \003,使用ctrl+v+c才能打印这个符号

自己在创建表格的时候定义分隔符的信息:

create  table  表名(
列名 数据类型
) row format delimited fields terminated by '字段分隔符'
collection items terminated by '元素分隔符'
map keys terminated by '键值对分隔符';

通过sql语句导入linux的文件内容到Hive数据库表格中:

load  data  local  inpath  'linux文件的位置和名字'  into  table  表名;

通过load data去添加数据才是hive数仓的常见的方式,用 insert into 操作比较少用到。

外部表

通过create table创建的表格都叫做内部表,通过create external

 table 创建的表格叫做外部表。
create  external  table  表名(
列名  数据类型
);

特点:

  1. 外部表是不能通过 truncate table 进行表格数据清空的
  2. 外部表如果使用 drop table 进行删除,只会删除在元数据库中的表格结构定义,不会删除在 hdfs 中的表格文件夹以及表格的数据
  3. 在数据的分层结构中,ODS层的表格,在hive数仓中,都会用外部表进行创建

保留的文件夹,可以通过建表来恢复表格:

create table test1(
userid int,
name string,
age int
)
location '/user/hive/warehouse/bigdata.db/ext_users';create external table test2(
userid int,
name string,
age int
)
location '/user/hive/warehouse/bigdata.db/ext_users';

通过 location 指向文件夹的表格,是不会在hdfs中创建自己的表格文件夹的。

内部表和外部表是可以相互转换的:
内 --> 外:

alter  table  内部表名字  set  tblproperties  ('EXTERNAL'='TRUE');

外 --> 内:

alter  table  外部表名字  set  tblproperties  ('EXTERNAL'='FALSE');

分区表

创建一个分区表
create table 表名(
column_1 type,
column_2 type,
...
) partitioned by (column _3 type)
row format delimited fields terminated by ',';--用逗号作为字段之间的分隔符
添加数据
  1. load data
loda data local inpath '数据文件的路径' into table 表名 partition(column=value)
  1. insert overwrite table / insert into table;overwrite:覆盖写入

  2. 查看表格有哪些分区:

show partitions 表名;
  1. 删除某个分区:
alter table 分区表名字 drop partition (column=value) 
  • 练习:使用insert语句进行分区表格的数据导入操作
    有一个表格是一个普通的表格,这个表格的数据量现在已经非常大了,操作不方便,需要将这个表格创建成一个分区表进行数据的存储。
    模拟创建一个普通的表格,然后再创建一个相同结构的分区表格,最后进行数据的导入。
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
)row format delimited fields terminated by ',';
--从Linux系统导入文件
load data inpath '/usr/my_docu/emp.txt' into table emp;
--创建一个分区表
create table emp_par(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float
)partitioned by (deptno int)
row format delimited fields terminated by ',';

从普通表emp中导入数据到分区表emp_par:

insert  overwrite|into  table  表名字  partition (分区字段=分区值) select  查询语句; 

动态导入分区的方法
上文手动去指定分区的方式,叫做静态分区,也可以通过动态分区导入数据:

  1. 打开hive中和动态分区相关的参数
    • 动态分区的支持参数:set hive.exec.dynamic.partition=true;
    • 动态分区中有一个非严格模式需要设置:set hive.exec.dynamic.partition.mode=nonstrict;
  2. 编写sql语句,进行数据的导入和添加,在sql中,分区的值是不需要自己去指定的,他是根据sql语句来自动判断的。
insert overwrite |into table 表名 partition (分区字段) select 查询语句;

静态分区和动态分区的区别

  1. 静态分区有load data和insert两种导数据的方法,动态分区只能insert导数据。
  2. 动态分区需要打开动态参数以及非严格模式的参数
  3. 静态分区在导入数据时,分区字段的值由用户手动设置,动态分区在导入时自动识别分区字段。
  4. 在使用insert导入数据的时候,静态分去不需要将分区字段写在select中,动态分区需要将分区值写在select后面
外部的分区表:

创建一个外表,读取某个hdfs文件夹已经存在的分区信息:
在这里插入图片描述
在hdfs中上传了这个logs的文件夹目录结构:

hadoop fs -put /root/logs /tmp

创建一个外部表,通过location关键字读取这个Logs文件夹里面的数据:

-- 创建一个外部的分区表
create external table ext_test(
id int,
name string,
price int
) partitioned by (dt string)
row format delimited fields terminated by ','
location '/tmp/logs';-- 现在这个表里面通过 show partitions 语句是看不到分区结构的,分区需要我们自己去添加,这个时候我们需要将分区的值和对应的分区所在的文件夹通过alter语句进行一个绑定
alter table ext_test add partition (dt=20240901) location '/tmp/logs/20240901';
alter table ext_test add partition (dt=20240902) location '/tmp/logs/20240902';
alter table ext_test add partition (dt=20240903) location '/tmp/logs/20240903';

分桶表

分区表

  1. 是为了加快表格筛选的速度,在针对分区字段进行数据读取的时候,速度会更快,效率更高,只需要读取分区文件夹的内容即可。优化的是where阶段的内容;
  2. 分区表是以文件夹的操作去进行表格数据拆分的;
  3. 分区表是用新的字段进行数据分区;
  4. 分区表是自己指定分区的规则。

分桶表

  1. 为了加快表格在group by和join操作的时候,select语句操作的效率;
  2. 分桶表是直接拆分成多个文件;
  3. 分桶表是用表格中的已有字段进行分桶的;
  4. 分桶表是根据哈希算法来自动分配的(将任何的内容转换成数字,用数字除以划分的数字,根据除以之后的余数进行数据的存储)。
创建一个分桶表

语法:

create table 表名(
列名 字段类型,
...
) clustered by (表格中已有字段) into 分桶数 buckets;--示例
create table emp_c(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
) clustered by (deptno) into 3 buckets;
row format delimited fields terminated by ',';

根据什么来决定最终表格划分多少桶是最合适的?
被导入的数据量的大小/(blocksize*2) = 分桶的数量
假如文件是1G的大小,那么就是1024/256=4。(让数据均匀分散在各个桶中)

  1. 使用Load data来导入数据文件到分桶表格。
    分桶表格的数据导入,不能运行在本地模式上,开了不影响它运行。
load data local inpath '/root/emp.txt' into table emp_c;
  1. 通过insert 语句插入数据到分桶表格
insert overwrite table emp_c
select * from emp;

hive中的四个不同的by操作

  • order by:对整个表格进行排序。不管你的表格有多大,最终都是用一个reduce的进程来完成整个表格的排序操作的。多用于当表格的数据量不大的时候,或者是表格的排序字段相对来说比较有规律的时候。
  • sort by:当使用的reduce进程是一个的时候,和 order by 是没有任何区别的,如果我们设置了reduce的数量,那么表格就会在多个reduce进程中分别的并行的进行排序。
set mapred.reduce.tasks;   #检查reduce数量,默认是-1表示没有去设置reduce
我们可以修改这个reduce的数量。
例如 
set mapred.reduce.tasks=2;
select * from emp sort by sal desc;

如果只想在不同的分桶中进行数据的排序的,不针对整个表格,直接按照上面的sort by的操作,是看不出来按照什么规则和字段进行分桶排序的,所以sort by语句,一般会和 distribute by 结合使用。

  • distribute by:按照什么字段对表格进行分桶的数据的拆分。这个关键字是不能单独使用的,必须和 sort by 结合使用。
select * from emp distribute by empno sort by sal desc;
  • cluster by:相当于 distribute by A字段 sort by A字段 asc
select * from emp distribute by sal sort by sal asc;
等效于
select * from emp cluster by sal;

表格的存储类型和数据的压缩格式

  1. textfile文本格式:hive创建表格的默认格式
create table test1(
id int,
name string
);
#或者
create table test1(
id int,
name string
) stored as textfile;

emp默认的textfile表格,大小是8.5M

创建一个表格,里面存储emp表格的数据,表格结构和emp表是一样的,只是数据是压缩的数据:
create table emp_ys(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
) row format delimited fields terminated by ',';打开数据在写入的时候,同时压缩数据的开关和参数:
set hive.exec.compress.output=true;
set mapred.output.compress=true;将emp表格的数据,insert overwrite 到emp_ys的表格中:
insert overwrite table emp_ys 
select * from emp;同样数据的表格,压缩之后是 45.3 K,默认的压缩格式是 .deflate,除了这个默认的格式,通用的还有一种格式叫做 .gzip
gzip emp_more2.txt    就会得到一个 emp_more2.txt.gz 的压缩文件
导入这个文件到emp_ys表格中。
load data local inpath '/root/emp_more2.txt.gz' into table emp_ys;
用gzip压缩之后是 42.8 K
  1. parquet拼接文件
    创建一个parquet类型的表格
create table emp_parquet(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
) row format delimited fields terminated by ','
stored as parquet;insert overwrite table emp_parquet 
select * from emp;这个表格默认大小是 546.7 K

1 aa 18
2 bb 17
3 cc 19
1 aa 18
1 aa 18
在拼接文件里面会用两个文件来存储表格的数据:
1 aa 18
2 bb 17
3.cc 19


1 1,4,5
2 2
3 3
它会把所有重复记录的行号放在一起。

创建一个有压缩格式的parquet的表格:
==parquet表格的压缩格式叫做 SNAPPY ==

create table emp_parquet_ys(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
) row format delimited fields terminated by ','
stored as parquet
tblproperties('parquet.compression'='SNAPPY');insert into emp_parquet_ys 
select * from emp;
压缩之后数据是  28.3 K

parquet格式适用于有大量重复数据的表格

  1. sequencefile 序列文件
    内部数据以键值对的方式存储:{“id”:1,“name”:lilei,“age”:18}
    对字段进行筛选和读取的时候,效率要比textfile文本格式高一些,但是会占用更多的存储空间。
create table emp_seq(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
) row format delimited fields terminated by ','
stored as sequencefile;insert overwrite table emp_seq select * from emp;
--存储空间占用是 12.1 M

序列文件的压缩格式 叫做 BLOCK,默认使用的是RECODE格式,是不压缩的。

想要使用压缩格式,先要打开hive的压缩开关
set hive.exec.compress.output=true;
再设置sequencefile表格的格式
set mapred.output.compression.type=BLOCK;
使用压缩格式后,文件大小为:51.8K
  1. orc列存格式
    orc是项目中用的最多的一种数据存储的格式。orc是列存数据的格式,上面三种都是行存数据。orc是唯一一个默认压缩的数据表格,orc是以行单位进行压缩和解压的。适合中大型表格的存储。
create table emp_orc(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
) stored as orc;insert overwrite table emp_orc
select * from emp;默认的压缩格式叫做  zlib
-- 16.7 K

textfile:deflate gzip
parquet:SNAPPY
sequencefile:BLOCK
orc:zlib

表格数据的更新于删除

在默认的textfile表格中,行数据是不支持update语句和delete语句的。只能通过其他方式实现update和delete类似的效果:
不好使,别这样用

示例:
1.更新SMITH的工资为900
insert overwrite table emp 
select empno,ename,job,mgr,hiredate,900,comm,deptno from emp where ename='SMITH'
union all
select * from emp where ename !='SMITH';2.假入要删除SMITH的数据
insert overwrite table emp
select * from emp where ename!='SMITH';

当表格的数据量很大的时候,上面的方法消耗的系统资源是很多的,操作的效率也很慢,所以很大的表格使用Orc进行存储,并且在orc里面会开启一个事务的属性,orc就可以支持update和delete的语句。

在hive中默认是不支持事务属性创建的,需要先提前打开hive的参数
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.support.concurrency=true;create table emp_orc02(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int
) stored as orc
tblproperties('transactional'='true');开启事务属性insert overwrite table emp_orc02 select * from emp;-- 在开启了事务的表格中,orc表可以支持update和delete语句
update emp_orc02 set sal=888 where ename='SMITH';
delete from emp_orc02 where ename='ALLEN';

临时表

create temporary table 临时表名字(
列名 数据类型
);

create temporary table tmp_user(
id int,
name string,
age int
);

临时表是用来保存数据计算过程中的中间数据的,可以将某个比较复杂的sql拆分,将中间的计算过程保存在临时表中,可以用来简化某个sql的逻辑。
临时表数据是保存在内存中的,重新打开窗口,表格数据就会被清空了。

视图

视图是一个虚拟的表格,不占用磁盘空间的,视图是一个select语句查询的结果集,每次查询视图,都是对这个select语句进行查询。视图只是将一个select语句当成一个别名来进行查询和使用。(有点像Oracle中的with as 子句)
create view 视图名字
as
select 语句;

create view dept_sal
as
select deptno,avg(sal) s from emp group by deptno;

表格的复制

  1. 完整的复制一个一模一样的表格:create table 新的表名 like 已有的表名;这种复制的方式,只会复制表格的结构,不会复制表格的数据。

  2. 复制一个select查询结果集的内容:create table 新的表名 as select 查询;

完整的建表语句

create  [external]  [temporary]  table  表名(
列名  数据类型
) [partitioned by (分区字段  分区类型)]
[clustered by (分桶字段) into xx buckets]
[row format delimited fields terminated by ''--字段间分隔符
collection items terminated by ''  --复杂数据间分隔符
map keys terminated by ''] --键值对间分隔符
[tblproperties (属性名=属性值)]
[stored as 存储类型]
[location 'hdfs文件夹存储位置'];

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis进阶

一、日志管理 mybatis主要使用logback来管理日志&#xff0c;具体内容之前的java进阶有说&#xff0c;链接如下 java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类_java logs是什么意思-CSDN博客 二、动态SQL 动态SQL指的是根据参数数据动态组织SQL的技术。 …

Qt获取本机Mac地址、Ip地址

一、简述 今天给大家分享一个获取本机IP地址和Mac地址的方法&#xff0c;经过多次测试&#xff0c;台式机、笔记本等多个设备&#xff0c;暂时没有发现问题。 由于很多时候本地安装了虚拟机、蓝牙、无线网卡或者其他设备等&#xff0c;会有多个Mac地址&#xff0c;所以需要进…

SQL Server2012保姆安装教程----带你快速上手数据库创建

目录 1.前言 2.安装准备 3.参考文章 4.安装过程 5.快速上手 5.1如何连接服务器 5.2创建数据库 5.3添加新的文件 5.4属性介绍 5.5创建表的引入 1.前言 我之前使用的就是mysql数据库&#xff0c;这个数据库使用的比较多&#xff0c;我学的初期也是这个&#xff1b; 但是…

虚拟机使用FileZilla软件实现文件互传

软件版本&#xff1a;FizeZilla 3.63.2 VirtualBox7.0.20 1.设置桥接模式(网卡) 2.查看ip 在控制台输入ifconfig 3.在终端打开控制台安装FTP服务 sudo apt-get install vsftpd 等待软件自动安装&#xff0c;安装完成以后使用 VI命令打开 /etc/vsftpd.conf&#xff0c;命令…

Kali 联网

VMware 中分三种网络模式 桥接模式&#xff1a;默认余宿主机 VMnet0 绑定&#xff0c;像一台独立机 NAT 模式&#xff1a;默认余宿主机 VMnet8 绑定&#xff0c;需要通过物理机连接外网 仅主机模式&#xff1a;默认余宿主机 VMnet1 绑定&#xff0c;只能与物理机通信 VMware…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveVelocity

机器自动化控制器——第三章 轴指令 6 MC_MoveVelocity变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 动作示例▶动作示例▶梯形图▶结构文本(ST) MC_MoveVelocity 使用伺服驱动器的位置控制模式&#xff0c;进行…

股价已暴涨64000%,估值比英伟达还高,Costco股票还能投资吗?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;自1985年上市以来&#xff0c;Costco的股价已经上涨了64,000%以上。 &#xff08;2&#xff09;该公司已成为了美股市场上最被高估的公司之一&#xff08;估值比英伟达还高&#xff09;。 &#xff08;3&#xff09;猛兽…

八大排序——万字长文带你剖析八大排序(C语言)

本篇文章主要介绍八大排序的思想和具体实现&#xff0c;也会分析具体的时间复杂度和空间复杂度&#xff0c;提醒一些容易出现的坑和实现一些不同版本的排序&#xff0c;以及这些不同排序之间的效率分析 目录 1.插入排序 1.1直接插入排序 1.1.1 直接插入排序的思想&#xff…

linux 下的静态库与动态库

目录 一、介绍 1、静态库 2、动态库 二、操作 1、静态库 2、动态库 3、使用库文件 &#xff08;1&#xff09;方法一 &#xff08;2&#xff09;方法二 &#xff08;3&#xff09;方法三 一、介绍 1、静态库 静态链接库实现链接操作的方式很简单&#xff0c;即程序文…

【2024W38】肖恩技术周刊(第 16 期):白嫖AI的最佳时段

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

同等学力申硕英语网课如何选择

很多考生想知道同等学力申硕英语网课如何选择&#xff0c;小编告诉大家&#xff0c;首先明确自己的学习目标和需求是为了提高口语、阅读、写作还是听力能力? 只有明确了自己的学习目标和需求&#xff0c;才能更好地选择适合自己的课程和平台。 二、选择知名品牌和口碑良好的平…

怎么一键更换PPT模板?2个做PPT必备的办公神器推荐!

在主打快节奏的当下&#xff0c;一份精美的PPT演示文稿往往能够为你赢得更多的关注和机会。但不可否认的是&#xff0c;制作一份高质量的PPT并非易事&#xff0c;特别是当你需要频繁更换PPT模板以应对不同场合时&#xff0c;根本抽不出时间来逐一修改。 本文将为大家介绍2款强…

什么是上层封禁海外流量

上层封禁海外流量&#xff08;Upper-layer Blocking of Overseas Traffic&#xff09;是一种网络安全策略&#xff0c;旨在通过在网络传输的上层进行流量控制和过滤&#xff0c;从而阻止来自海外的恶意流量或不必要的访问。这一措施主要用于防止分布式拒绝服务&#xff08;DDoS…

多线程——“死锁”

目录 前言 一、一个线程&#xff0c;一把锁 1.问题介绍 2.可重入锁 二、两个线程&#xff0c;两把锁 1.问题介绍 2.解决方式 三、N个线程&#xff0c;M把锁 1.哲学家就餐问题 2.解决方式 结尾 前言 “死锁”是多线程代码中一类常见的问题&#xff0c;加锁是能解决线…

java算法OJ(1)位运算

目录 1.前言 2.正文 2.1位运算符号 2.1俩数相除 2.1.1题目 2.1.2示例 2.1.3题解 2.2二进制求和 2.2.1题目 2.2.2示例 2.2.3题解 2.3只出现一次的数字 2.3.1题目 2.3.2示例 2.3.3题解 2.4只出现一次的数字&#xff08;进阶版&#xff09; 2.4.1题目 2.4.2示例…

怎么在Proteus中找到排阻

1、打开安装好的Proteus&#xff0c;点击上方菜单栏中的“库”&#xff0c;再选择“从库选取零件”&#xff0c;或者在左侧元件列表中单击鼠标右键&#xff0c;再点击右键菜单中的“从库中挑选”选项。 2、之后会打开元器件库&#xff0c;我们打开类别中的“Resistors”&#x…

方法部分 学习

方法是程序中最小的执行单元 方法的定义调用 public static void 方法名&#xff08;&#xff09;{ 方法体 } 写在main方法外面&#xff0c;在main函数里面直接调用带参数&#xff1a;public static void 方法名&#xff08;int num1 &#xff0c; int num2&am…

付费计量应用过程(Payment Metering Application process)

The Payment Metering Application process is the combination of the business and support processes as the resultant interactions between the business and support functions, which thus describes the dynamic behavior of the system as a whole. 付费计量…

postman中使用Pre-request Script

一、get方法 get请求时 &#xff0c;有多个params&#xff0c;并且有一个参数为sign&#xff0c;这个参数是有其他params拼接之后md5加密得到的&#xff0c;如何通过js语句获取params参数并生成sign。 const CryptoJS require(crypto-js); // 引入 CryptoJS 库进行 MD5 加密…

深度学习(5):逻辑斯蒂回归Logistic

文章目录 一、逻辑斯蒂回归&#xff08;Logistic Regression&#xff09;二、KL 散度&#xff08;相对熵&#xff09;三、交叉熵&#xff08;Cross-Entropy&#xff09;四、关系五、总结 一、逻辑斯蒂回归&#xff08;Logistic Regression&#xff09; 概述 逻辑斯蒂回归是一种…