在使用Hive的过程中,导入数据是必不可少的步骤,不同的数据导入方式效率也不一样,本文总结Hive四种不同的数据导入方式:

  • 从本地文件系统导入数据
  • 从HDFS中导入数据
  • 从其他的Hive表中导入数据
  • 创建表的同时导入数据

使用导入数据时,会使用到into和overwrite into两个关键字,into是在当前表追加数据,而overwrite into是删除当前表的数据然后在导入数据。

从本地系统导入数据

在Hive中创建load_data_local表,该表中有两个字段,一个是name一个是age。创建表的SQL语句如下:

create table if not exists load_data_local(name string,age int)
row format delimited fields terminated by ' '
lines terminated by '\n';

在本地文件系统中创建一个load_data_local.txt的文件,然后往里面写入数据,数据之间用空格分隔。数据为:

zhangsan 30
lisi 50
wangwu 60
peiqi 6

执行load data local inpath '/home/hadoop/hive_test/load_data_local.txt' into table load_data_local;命令,即可将本地系统中的文件的数据导入到Hive表中。

在使用从本地系统导入数据大Hive表中时,文件的路径必须使用绝对路径。

有两种方式验证数据是否导入成功,一种是在Hive中执行select * from load_data_local。另外一种是查看hdfs文件系统中的load_data_local目录下面是否有刚刚上传的load_data_local.txt文件,查看命令为:hadoop fs -ls /user/hive/warehouse/bigdata17.db/load_data_local,结果为:

18/10/07 02:37:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rwxr-xr-x 3 root supergroup 38 2018-10-07 02:24 /user/hive/warehouse/bigdata17.db/load_data_local/load_data_local.txt

从HDFS中导入数据

在Hive中创建load_data_hdfs表,表中有两个字段,分别是name和age。创建表的SQL如下:

create table if not exists load_data_hdfs(name string,age int)
row format delimited fields terminated by ' '
lines terminated by '\n';

在本地文件系统创建文件load_data_hdfs.txt文件,然后往里面写入数据。

将load_data_hdfs.txt文件上传到HDFS的data目录下面,命令为:hadoop fs -put load_data_hdfs.txt /data

在Hive中执行命令:

load data inpath 'data/load_data_hdfs.txt' into table load_data_hdfs;

即可将数据导入到Hive的load_data_hdfs表中。

从本地系统导入数据和从hdfs文件系统导入数据用的命令都是load data,但是从本地系统导入数据要加local关键字,如果不加则是从hdfs文件系统导入数据。

从hdfs文件系统导入数据成功后,会把hdfs文件系统中的load_data_hdfs.txt文件删除掉。

从其他的Hive表中导入数据

这种方式要求目标表和源表都必须存在。

创建一个要导入数据的目标表,SQL如下:

create table if not exists load_data_local2(name string,age int)
row format delimited fields terminated by ' '
lines terminated by '\n';

导入数据的SQL:

insert into table load_data_local2 select * from load_data_local;

这种数据导入方式也适用于分区表和分桶表的情况。本文只介绍导入分区表的情况,导入数据到分区表分为静态分区和动态分区两种方式。

我们先创建一个分区表,SQL如下:

create table if not exists load_data_partition(name string)
partitioned by(age int)
row format delimited fields terminated by ' '
lines terminated by '\n';

将数据导入分区表必须先在Hive中执行下面两句语句:

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

静态方式将load_data_local表的数据导入到load_data_partition表的sql语句如下:

insert into table load_data_partition partition(age=25) select name from load_data_local;

这种方式必须显示的指定分区值,如果分区有很多值,则必须执行多条SQL,效率低下。

动态方式将load_data_local表的数据导入到load_data_partition表的sql语句如下:

insert overwrite table load_data_partition partition select name,age from load_data_local;

这种方式要注意目标表的字段必须和select查询语句字段的顺序和类型一致,特别是分区字段的类型要一致,否则会报错。

一张表有两个以上的分区字段,如果同时使用静态分区和动态分区导入数据,静态分区字段必须写在动态分区字段之前。

Hive还支持一条SQL语句中将数据插入多个表的功能,只需将from关键字前置即可:

from load_data_local
insert overwrite table load_data_partition partition (age)
select name,age
insert overwrite table load_data_local3
select *

上面的sql语句同时插入到表load_data_partition和load_data_local3表中。这种方式非常高效,对于大数据量并且要将数据插入到多个表的情况下,建议用这种方式。

创建表的同时导入数据

这种方式的创建表的表结构来自于select查询语句的查询字段。

创建load_data_local3并将load_data_loaca的数据导入到load_data_local3表中:

create table load_data_local3 as select * from load_data_local;

一起学Hive——详解四种导入数据的方式的更多相关文章

  1. Android开发之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...

  2. android中的LaunchMode详解----四种加载模式

    Activity有四种加载模式: standard singleTop singleTask singleInstance 配置加载模式的位置在AndroidManifest.xml文件中activi ...

  3. Java 中 synchronized的用法详解(四种用法)

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧 ...

  4. Android-基本控件和详解四种布局方式

    转自:https://www.cnblogs.com/ludashi/p/4883915.html 一.常用基本控件 1.TextView 看到Android中的TextView, 我不禁的想到了iO ...

  5. IOS四种保存数据的方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...

  6. IOS 四种保存数据的方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...

  7. Hive 中的四种排序详解,再也不会混淆用法了

    Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...

  8. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  9. 详解Python模块导入方法

    python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...

随机推荐

  1. 【转】Linux查看系统是32位还是64位方法总结

    这篇博客是总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本篇只是整理.梳理这方面的知识,方便自己忘记的时候随时查看. 方法1:getconf LONG_BIT ...

  2. linux下.bashrc文件 /PATH环境变量修改 /提示符修改

    1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到4个隐藏文件, .bash_history   记 ...

  3. $Django setting.py配置 ,GET、POST深入理解,三件套,orm对象关系映射简介

    1 django中app的概念: 大学:----------------- 项目  信息学院 ----------app01  物理学院-----------app02 ****强调***:创建的每一 ...

  4. vue 不常见操作

     对 v-html 的扩展操作, 问题产生背景, 在vue 项目中,用v-html渲染 html字符串,这里面包括a 标签等内容,因为某种需求,a 的默认跳转不符合要求,要经过自己定义的方法跳转. 原 ...

  5. Laravel 怎么在 blade 视图中将带 HTML 字符原样输出

    ### 感觉这是比较细小的,细节处理问题,很容易就一下子想不起怎么处理 但知道处理方式是那么简单时,真的觉得基础不够扎实 ### 富文本编辑内容: 视图原样输出: 视图模板的标签是这样处理就可以的-- ...

  6. 移动端适配——font-size计算

    function calcFontSize(){ var view_width = window.screen.width; var view_height = window.screen.heigh ...

  7. Android 应用防止被二次打包指南

    前言 “Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包.不管从性能.用户体验.外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不 ...

  8. Confluence 6 启用主题评论

    页面或者博客页面中显示的评论以下面 2 种方式显示: 主题模式(Threaded):以继承回复的方式显示页面的评论.每一回复的评论将会在不同评论之间显示,以表示各个评论之间的关系. 平面模式(Flat ...

  9. PLC漏洞问题

    1.PLC采用大多是经过裁剪的实时操作系统,比如像linux RT.QNX.VxWorks等,这些实时操作系统广泛应用在通信.军事.航天.等工程领域,但是随之工业与网络的互连爆发出很多问题,常见的PL ...

  10. Django标签&迭代&循环&过滤

    1.{% for Person in persons %}模板标签的替换,就是利用了基础模板的底层设计,嵌套了其他显示的内容.常见的内容替换标签{% block content %}{%endbloc ...