【大数据Hive】hive 加载数据常用方案使用详解

目录

一、前言

二、load 命令使用

2.1 load 概述

2.1.1 load 语法规则

2.1.2 load语法规则重要参数说明

2.2 load 数据加载操作演示

2.2.1 前置准备

2.2.2 加载本地数据

2.2.3 HDFS加载数据

2.2.4 从HDFS加载数据到分区表中并指定分区

2.3 hive3.0+ load 命令新特性

2.3.1 操作演示

三、insert 命令使用

3.1 语法

3.2 insert + select 操作演示

3.2.1 创建一张源表

3.2.2 加载数据

3.2.3 创建一张目标表

3.2.4 使用insert+select插入数据到新表

3.3 multiple inserts

3.3.1 操作演示

3.4 insert 之动态分区插入

3.4.1 动态分区概述

3.4.2 操作演示

3.5 insert 之导出数据

3.5.1 标准语法

3.5.2 其他写法

3.5.3 导出数据操作演示1

3.5.4 导出数据操作演示2

3.5.5 导出数据操作演示3

四、写在文末


一、前言

使用hive对数据表加载数据时方式有很多,比如直接通过insert into插入数据,或者先创建表,然后在hdfs上面上传数据文件进行数据加载的方式等等,本篇将重点介绍如何对hive的table进行数据的导入导出。

二、load 命令使用

在正式开始之前,先来回顾下之前的文章中讲到的一种常用的数据加载方式,即使用load的方式进行数据映射;

总结来说,包括如下几点:

  • 在Hive中建表成功之后,就会在HDFS上创建一个与之对应的文件夹,且文件夹名字就是表名;
  • 文件夹父路径是由参数hive.metastore.warehouse.dir控制,默认值是/user/hive/warehouse;
  • 也可以在建表的时候使用location语句指定任意路径;

默认情况下,当我们创建完成一个table之后,不管路径在哪里,只有把数据文件移动到对应的表文件夹下面,Hive才能映射解析成功,最原始的方式就是使用 hadoop fs –put|-mv 等方式直接将数据移动到表文件夹下,但是,Hive官方推荐使用Load命令将数据加载到表中;

2.1 load 概述

Load英文单词的含义为:加载、装载,所谓加载是指:将数据文件移动到与Hive表对应的位置,移动时是纯复制、移动操作;

纯复制、移动指在数据load加载到表中时,Hive不会对表中的数据内容进行任何转换,任何操作;

2.1.1 load 语法规则

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

或者

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)

2.1.2 load语法规则重要参数说明

语法规则之filepath

  • filepath表示待移动数据的路径。可以指向文件(在这种情况下,Hive将文件移动到表中),也可以指向目录(在这种情况下,Hive将把该目录中的所有文件移动到表中);
  • filepath文件路径支持下面三种形式,要结合LOCAL关键字一起考虑;

filepath可以使用绝对路径或者相对路径

1、相对路径,例如:project/data1;

2、绝对路径,例如:/user/hive/project/data1;

3、具有schema的完整URI,例如:hdfs://namenode:9000/user/hive/project/data1;

语法规则之 local

  • 指定LOCAL, 将在本地文件系统中查找文件路径;

1、若指定相对路径,将相对于用户的当前工作目录进行解释;

2、用户也可以为本地文件指定完整的URI-例如:file:///user/hive/project/data1

如果没有指定 local 关键字

  • 如果filepath指向的是一个完整的URI,会直接使用这个URI;
  • 如果没有指定schema,Hive会使用在hadoop配置文件中参数fs.default.name指定的(不出意外,都是HDFS);

问题:LOCAL本地是哪里?

如果对HiveServer2服务运行此命令,本地文件系统指的是Hiveserver2服务所在机器的本地Linux文件系统,不是Hive客户端所在的本地文件系统

语法规则之 OVERWRITE

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

2.2 load 数据加载操作演示

模拟从本地加载数据

2.2.1 前置准备

创建三张表,分别演示从本地以及hdfs上面加载数据

create table student_local(num int,name string,sex string,age int,dept string) 
row format delimited fields terminated by ',';

再创建第二张表

create external table student_HDFS(num int,name string,sex string,age int,dept string) 
row format delimited fields terminated by ',';

创建第三张分区表,用于演示从HDFS加载数据到分区表

create table student_HDFS_p(num int,name string,sex string,age int,dept string) 
partitioned by(country string) row format delimited fields terminated by ',';

2.2.2 加载本地数据

从本地加载数据 

LOAD DATA LOCAL INPATH '/usr/local/soft/hivedata/students.txt' INTO TABLE student_local;

执行完成后查看表,可以看到数据就加载到表中了; 

 同时再去检查hdfs目录,可以看到数据也被加载到hdfs目录下了;

  其实,这种操作其底层在执行时,本质上还是执行了是hadoop fs -put上传的操作

2.2.3 HDFS加载数据

将数据上传到hdfs

hdfs dfs -put /usr/local/soft/hivedata/students.txt /

 上传成功后,在根目录下就可以看到这个文件了

将上述hdfs根目录下的数据移动到表中

LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS;

这时再去hdfs的根目录下检查,发现这个数据文件竟然不在了

 这种加载数据的方式,其本质是hadoop fs -mv 进行数据移动的操作

2.2.4 从HDFS加载数据到分区表中并指定分区

上传数据到根目录

hdfs dfs -put /usr/local/soft/hivedata/students.txt /

使用load命令将数据加载到分区表

LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS_p partition(country ="China");

2.3 hive3.0+ load 命令新特性

Hive3.0之后,load加载数据时除了移动、复制操作之外,在某些场合下还会将加载重写为INSERT AS SELECT,还支持使用inputformat、SerDe指定输入格式,例如Text,ORC等。

比如,如果表具有分区,则load命令没有指定分区,则将load转换为INSERT AS SELECT,并假定最后一组列为分区列,如果文件不符合预期,则报错。

2.3.1 操作演示

创建一张测试使用的分区表

CREATE TABLE if not exists tab1 (col1 int, col2 int)
PARTITIONED BY (col3 int)
row format delimited fields terminated by ',';

创建一个数据文件,格式如下


正常情况下的数据加载

LOAD DATA LOCAL INPATH '/usr/local/soft/hivedata/tab1.txt' INTO TABLE tab1 partition(col3="1");

加载完成后可以看到数据已经加载到表中

上面谈到hive3.0之后,load命令如果没有指定分区,则将load转换为INSERT AS SELECT,并假定最后一组列为分区列,接下来我们清空该表,使用下面的命令重新执行一次;

LOAD DATA LOCAL INPATH '/usr/local/soft/hivedata/tab1.txt' INTO TABLE tab1;

 从hdfs上面可以发现,被成功映射为分区表了;

通过执行过程发现,这个时间有点长,因为底层要将这个操作转化为 INSERT AS SELECT 的操作;

三、insert 命令使用

MySQL这样的RDBMS中,通常使用insert+values的方式来向表插入数据,并且执行速度很快,假如把Hive当成RDBMS,用insert+values的方式插入数据,会如何?

不妨来做过简单的试验吧,创建一张表

create table t_test_insert(id int,name string,age int);

然后向表中插入一条数据

insert into table t_test_insert values(1,"allen",18);

尽管数据可以插入成功,但是执行过程比较漫长,原因在于底层是开启了了MapReduce任务,通过map-reduce任务把数据写入Hive表中;

试想一下,如果在Hive中使用insert+values,对于大数据环境一条条插入数据,用时难以想象,所以Hive官方推荐加载数据的方式:清洗数据成为结构化文件,再使用Load语法加载数据到表中。这样的效率更高。

但是并不意味insert语法在Hive中没有用武之地了,下面介绍hive中insert的其他用法;

insert + select

insert+select表示:将后面查询返回的结果作为内容插入到指定表中,注意OVERWRITE将覆盖已有数据;

3.1 语法

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

使用insert+select 需要注意:

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

3.2 insert + select 操作演示

3.2.1 创建一张源表

create table student(num int,name string,sex string,age int,dept string)
row format delimited
fields terminated by ',';

3.2.2 加载数据

load data local inpath '/usr/local/soft/hivedata/students.txt' into table student;

3.2.3 创建一张目标表

该表只有两个字段

create table student_from_insert(sno int,sname string);

3.2.4 使用insert+select插入数据到新表

不难理解,执行了这条sql之后,student表中的num,name两个字段数据将会填充到student_from_insert表中;

insert into table student_from_insert select num,name from student;

3.3 multiple inserts

顾名思义就是,多次插入,多重插入,其核心功能是:一次扫描,多次插入;

使用该语法的目的就是减少扫描的次数,在一次扫描中,完成多次insert操作;

3.3.1 操作演示

在上面的insert + select 中创建了一张student的表,再创建两张新表,各有一个字段;

create table student_insert1(sno int);
create table student_insert2(sname string);

我们的需求是,从student中查询出sno放到第一个表,然后查询出sname放到另一个表中,如果按照大多数人直观的考虑,可能会像下面这么做:

insert into student_insert1 select num  from student;

insert into student_insert2 select name  from student;

如果使用多重插入来做的话,就可以使用下面的sql一次性完成;

from student
insert overwrite table student_insert1
select num
insert overwrite table student_insert2
select name;

执行完成后,可以检查两个表的数据是否成功插入;

3.4 insert 之动态分区插入

背景说明

对于分区表的数据导入加载,最基础的是通过load命令加载数据,在load过程中,分区值是手动指定写死的,叫做静态分区。

假如说,现在有全球224个国家的人员名单(每个国家名单单独一个文件),导入到分区表中,不同国家不同分区,如何高效实现?如果使用load命令,岂不是要导入224次?这样的话效率就太低了。

3.4.1 动态分区概述

动态分区插入指的是:分区的值是由后续的select查询语句的结果来动态确定的,根据查询结果自动分区。

两个重要参数

hive.exec.dynamic.partitiontrue需要设置true为启用动态分区插入
hive.exec.dynamic.partition.modestrict在strict模式下,用户必须至少指定一个静态分区,以防用户意外覆盖所有分区;在nonstrict模式下,允许所有分区都是动态的

3.4.2 操作演示

首先设置动态分区模式为非严格模式(默认已经开启了动态分区功能)

set hive.exec.dynamic.partition = true;

set hive.exec.dynamic.partition.mode = nonstrict;

在当前库下,已经有一张student表,创建分区表;

create table student_partition(Sno int,Sname string,Sex string,Sage int) 
partitioned by(Sdept string);

执行动态分区insert操作插入数据

insert into table student_partition partition(Sdept)
select num,name,sex,age,dept from student;

 

执行完成后,检查hdfs目录,可以发现数据已经按照分区保持了

3.5 insert 之导出数据

Hive支持将select查询的结果导出成文件存放在文件系统中,语法格式如下;

3.5.1 标准语法

INSERT OVERWRITE [LOCAL] DIRECTORY directory1    

[ROW FORMAT row_format] [STORED AS file_format]

SELECT ... FROM ...

3.5.2 其他写法

FROM from_statement

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...

关于语法补充说明

  • 目录可以是完整的URI。如果未指定scheme,则Hive将使用hadoop配置变量fs.default.name来决定导出位置;
  • 如果使用LOCAL关键字,则Hive会将数据写入本地文件系统上的目录;
  • 写入文件系统的数据被序列化为文本,列之间用\001隔开,行之间用换行符隔开。如果列都不是原始数据类型,那么这些列将序列化为JSON格式。也可以在导出的时候指定分隔符换行符和文件格式;

3.5.3 导出数据操作演示1

在上文中演示时用到了一张student表

导出查询结果到HDFS指定目录下

insert overwrite directory '/data' select num,name,age from student;

任务完成之后到hdfs目录下检查数据是否导出成功,也可以从hdfs将文件下载下来再次确认数据的正确性;

 

3.5.4 导出数据操作演示2

接下来我们在导出的时候指定一下分隔符和文件存储格式

insert overwrite directory '/data' row format delimited fields terminated by ','
stored as orc select * from student;

执行上面的导出sql

 去hdfs上检查数据是否导出成功

3.5.5 导出数据操作演示3

导出数据到本地文件系统指定目录下

insert overwrite local directory '/usr/local/soft/data' select * from student;

 执行完成之后检查本地数据目录下已经有了导出的数据;

四、写在文末

hive的数据导入在日常开发、运维过程中运用的场景非常普遍,且频率非常高,选择合理的数据导入方式可以给开发提升很多效率,有必要深入掌握。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目配置MongoDB的增删改查操作

在Vue中配置MongoDB的增删改查操作,需要先安装mongoose模块来连接MongoDB数据库。 1. 在Vue项目的根目录中,使用命令行安装mongoose模块: npm install mongoose --save 2. 找到启动node的app.js文件(我这里是在server文件中&…

Java开发之Redis(面试篇 持续更新)

文章目录 前言一、redis使用场景1. 知识分布2. 缓存穿透① 问题引入② 举例说明③ 解决方案④ 实战面试 3. 缓存击穿① 问题引入② 举例说明③ 解决方案④ 实战面试 4. 缓存雪崩① 问题引入② 举例说明③ 解决方案④ 实战面试 5. 缓存-双写一致性① 问题引入② 举例说明③ 解决…

Linux执行命令

命令格式 主命令 选项 参数(操作对象)例如: 修改主机名 hostname set-hostname 新名称显示/目录下的文件的详细信息 ls -l /命令 内置命令(builtin):shell程序自带的命令。 外部命令:有独立…

多通道振弦数据记录仪应用桥梁安全监测的关键要点

多通道振弦数据记录仪应用桥梁安全监测的关键要点 随着近年来桥梁建设和维护的不断推进,桥梁安全监测越来越成为公共关注的焦点。多通道振弦数据记录仪因其高效、准确的数据采集和处理能力,已经成为桥梁安全监测中不可或缺的设备。本文将从以下几个方面…

【JavaEE】_HTML

目录 1.HTML结构 2. HTML常用标签 2.1 注释标签 2.2 标题标签:h1~h6 2.3 段落标签:p 2.4 换行标签:br 2.5 格式化标签 2.6 图片标签:img 2.7 超链接标签:a 2.8 表格标签 2.9 列表标签 2.10 表单标签 2.10…

PPO算法

PPO算法 全称Proximal Policy Optimization,是TRPO(Trust Region Policy Optimization)算法的继承与简化,大大降低了实现难度。原论文 算法大致流程 首先,使用已有的策略采样 N N N条轨迹,使用这些轨迹上的数据估计优势函数 A ^ …

TCP 和 UDP 的区别、TCP 是如何保证可靠传输的?

先来介绍一些osi七层模型 分为应用层、表示层、会话层、运输层、网络层、链路层、物理层。 应用层(数据):确定进程之间通信的性质以及满足用户需要以及提供网络和用户应用,为应用程序提供服务,DNS,HTTP,HTTPS&#xf…

【LeetCode】剑指 Offer <二刷>(7)

目录 题目:剑指 Offer 14- I. 剪绳子 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 14- II. 剪绳子 II - 力扣(…

Java“牵手”唯品会商品详情数据,唯品会商品详情API接口,唯品会API接口申请指南

唯品会平台商品详情接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取唯品会商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口,…

Rhinoceros(犀牛)使用技巧:有关曲线和曲面的分析

Rhinoceros(犀牛) for Mac破解版是一款功能强大的高级建模软件,可以创建、编辑、分析、提供、渲染、动画与转换 NURBS 线条、曲面、实体与多边形网格。不受精度、复杂、阶数或是尺寸的限制,在本篇文章中,为您介绍的是有…

CUDA 问题 ,一直头大。。。。

1.卸载cuda ubuntu系统安装/卸载cuda和cudnn_怎么删除cudnn_Zhijun.liStudio的博客-CSDN博客ubuntu系统安装/卸载cuda和cudnn_怎么删除cudnnhttps://blog.csdn.net/weixin_45921929/article/details/128849198?ops_request_misc%257B%2522request%255Fid%2522%253A%252216939…

复现XSS漏洞及分析

XSS漏洞概述: 类型一:反射型 类型二:存储型 类型三:DOM型 复现20字符短域名绕过 一、安装BEEF 1、在Kali中运行apt install beef-xss 2、运行beef 3、在浏览器访问 二、安装galleryCMS *遇到一点小问题 提示"last…

ping: www.baidu.com: Name or service not known 写了DNS还是不行

环境描述:ESXI平台上,一台Centos7虚拟主机。 问题描述:平台上的其他的虚拟机可以正常ping通,就这台ping IP地址可以通,ping域名解析失败。 排查过程: 1、检查网卡配置文件和/etc/resolv.conf配置文件是否…

postgis数据库导出csv表再导入postgis

1、导出csv表 from settings_Address import * from sqlalchemy import create_engine, MetaData import pandas as pd def create_conn(Postgis_user,Postgis_password,Postgis_host,Postgis_port,dbname_PG):# return create_engine(PostgispyPostgis://{}:{}{}:{}/{}.forma…

FOXBORO FBM232 P0926GW 自动化控制模块

Foxboro FBM232 P0926GW 是 Foxboro(福克斯博罗)自动化控制系统的一部分,通常用于监测和控制工业过程。以下是关于这种类型的自动化控制模块可能具有的一些常见功能: 数字输入通道: FBM232 P0926GW 控制模块通常具有多…

HTML 标签讲解

HTML 标签讲解 HTML 语言结构根元素元数据元素主体根元素大纲元素文本内容语义化内联文本图像与多媒体编辑标识table表格内容表单内容table表单 HTML 语言结构 Markup (标记、标签)用来容纳和描述内容 严格意义上,标签是指开始标签&#xf…

Spring-Cloud-Openfeign如何传递用户信息?

用户信息传递 微服务系统中,前端会携带登录生成的token访问后端接口,请求会首先到达网关,网关一般会做token解析,然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务,微服务中会有拦截器来做用户信息的…

OFDM 系统在 AWGN 信道下对不同载波频率偏移 (CFO) 的 BER 灵敏度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决 今天发现rt系统的adc有一个缺陷(也可能是我移植的方法有问题,这就不得而知了!),就是只能单次转换,事情是这样的: 我在stm32的RT-T…

Git 版本回退 超神步骤

Git 版本回退 一. 背景 多版本分支开发,合并版本问题太多,需要回滚到某次版本。我的git客服端工具是 sourcetree 二.操作步骤 2.1 切到当前需要回退版本的分支 2.2 右击需要具体某一个分支,这个分支就是你想切到的分支版本,具体…