hive数据导入代码格式(会移动源文件位置):

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [partition (分区列名1=值1,分区列名2=值2,...)]

对以上公式细分,Hive有好几种常见的数据导入方式,这里介绍四种

(1) 从本地文件系统中导入数据到Hive表;

(2) 从HDFS上导入数据到Hive表; 

(3) 从别的表中查询出相应的数据并导入到Hive表中; 

(4) 在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。


0. 创建hive表

 hive> create table FEFJay
> (id int, name string,
> age int, tel string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE;
OK
Time taken: 2.832 seconds

这个表有四个字段,行的各个列之间分隔符是制表符,结果保存为文件。


1. 从本地文件导入数据到hive表

本地文件系统里面有个/home/FEFJay/FEFJay.txt文件,行的各个列之间分隔符是制表符,内容如下:

[FEFJay@master ~]$ cat FEFJay.txt
1 FEFJay 25 13188888888888
2 test 30 13888888888888
3 zs 34 899314121

执行命令,把文件导入到hive表:

hive> load data local inpath '/home/FEFJay/FEFJay.txt' into table FEFJay;

这样就将FEFJay.txt里面的内容导入到FEFJay表里面去了,可以到FEFJay表的数据目录下查看,如下命令:

hive>dfs -ls /user/hive/warehouse/FEFJay

和我们熟悉的关系型数据库不一样,Hive现在还不支持在insert语句里面直接给出一组记录的文字形式,也就是说,Hive并不支持INSERT INTO …. VALUES形式的语句。


2. 从HDFS上导入数据到Hive表

从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/FEFJay/),然后再将数据从那个临时目录下移动(是移动,不是复制)到对应的Hive表的数据目录里面。

HDFS有下面这个文件/home/FEFJay/add.txt,具体的操作如下:

hive> load data inpath '/home/FEFJay/add.txt' into table FEFJay;

这就把数据从Hadoop导入到hive表中了。

查看hive表数据:

hive> select * from FEFJay;

请注意load data inpath ‘/home/FEFJay/add.txt’ into table FEFJay; 里面是没有local这个单词的,这个是和从本地文件导入到hive表的区别。


3.从hive中别的表中查询出相应的数据并导入到另一个Hive表中

3.1 创建测试表

假设Hive中有test表,其建表语句如下所示:

hive>create table test(
>id int, name string,
>tel string
>partitioned by
>(age int)
>ROW FORMAT DELIMITED
>FIELDS TERMINATED BY '\t'
>STORED AS TEXTFILE;

大体和FEFJay表的建表语句类似,只不过test表里面用age作为了分区字段。

对于分区,这里在做解释一下:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如FEFJay表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。

3.2插入一个hive表的部分数据到另一个hive表

3.2.1 静态分区插入(目标表有明确分区)

将FEFJay表中的查询结果并插入到test表中:

hive> insert into table test
> partition (age='25')
> select id, name, tel from FEFJay;

查看插入结果:

 hive> select * from test;

这里做一下说明: 我们知道我们传统数据块的形式insert into table values(字段1,字段2),这种形式hive是不支持的。

3.2.2 动态分区插入(目标表没有明确分区)

如果目标表(test)中不存在分区字段,可以去掉partition (age=’25′)语句。当然,我们也可以在select语句里面通过使用分区值来动态指明分区:

hive>set hive.exec.dynamic.partition.mode=nonstrict;
hive> insert into table test
> partition (age)
> select id, name,
> tel, age
> from FEFJay;

这种方法叫做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把

hive.exec.dynamic.partition.mode设置为nonstrict。当然,Hive也支持insert overwrite方式来插入数据,从字面我们就可以看出,overwrite是覆盖的意思,是的,执行完这条语句的时候,相应数据目录下的数据将会被覆盖!而insert into则不会,注意两者之间的区别。例子如下:

hive> insert overwrite table test
> PARTITION (age)
> select id, name, tel, age
> from FEFJay;

3.3插入一个hive表的部分数据到另外多个hive表

更可喜的是,Hive还支持多表插入,什么意思呢?在Hive中,我们可以把insert语句倒过来,把from放在最前面,它的执行效果和放在后面是一样的,如下:

 hive> show create table test3;
CREATE TABLE test3( id int, name string) hive>from FEFJay
>insert into table test
>partition(age)
>select id, name, tel,age
>insert into table test3
>select id,name
>where age > 25;

可以在同一个查询中使用多个insert子句,这样的好处是我们只需要扫描一遍源表就可以生成多个不相交的输出。


4.复制表部分列作为新表

在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select 首字母大写)。

创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。

如下:

hive>create table test4
>as
>select id,name,tel
>from FEFJay;

数据就插入到test4表中去了,CTAS操作是原子的,因此如果select查询由于某种原因而失败,新表不会创建的!

导入(移动)数据到hive1.1.0表的方法的更多相关文章

  1. Hive:Spark中如何实现将rdd结果插入到hive1.3.0表中

    DataFrame写入hive API: registerTempTable函数是创建spark临时表 insertInto函数是向表中写入数据,可以看出此函数不能指定数据库和分区等信息,不可以直接进 ...

  2. 在Windows Server2008R2中导入Excel不能使用Jet 4.0的解决方法

    一直使用以下代码从Excel中取数据,速度快方便: string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Dat ...

  3. ssms导入excel数据提示未安装插件的解决方法

    今天用ssms导入excel的时候,提示 然后去找了一下解决方案,安装了相对应的插件.但是还是会提示这个问题. 又去找了一下原因,找到一个原因是sqlserver启动的时候是32位的,但是导入需要64 ...

  4. MySQL 导入外部数据

    手工为数据库录入数据: 1 -- 使用数据库 2 use test; 3 4 -- 创建fruits数据表 5 create table fruits( 6 f_id char(10) not nul ...

  5. VLOOKUP函数将一个excel表格的数据匹配到另一个表中

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  6. Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)

    无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...

  7. 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库

    将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...

  8. 【BIEE】04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0

    有时候,我们往往会存在这样的需求 例如:事实表的数据如下 EMP_FACT表示事实表,DIM_LEVEL是维度表 预期效果:(根据员工信息,分析各等级员工工资与员工个数) 我们在BIEE报表中新建报表 ...

  9. EXCEL批量导入到Sqlserver数据库并进行两表间数据的批量修改

    Excel 大量数据导入到sqlserver生成临时表并将临时表某字段的数据批量更新的原表中的某个字段 1:首先要对EXCEL进行处理 列名改成英文,不要有多余的列和行(通过ctrl+shift 左或 ...

随机推荐

  1. [转]WIN2008 IIS7的日期格式

    最近项目升级服务器从32位升级到64位的WIN2008,日期显示格式非我们所期望的yyyy-M-d格式,原以为修改控制面板的日期格式即可,可是不行. 修改注册表问题解决. 修改方法: 运行注册表编辑器 ...

  2. Python中的装饰器的使用及固定模式

    装饰器的使用: 在不想修改函数的调用方式,但是想给函数添加内容的功能的时候使用     为什么使用装饰器: 软件实体应该是可扩展,而不可修改的.也就是说,对扩展是开放的,而对修改是封闭的. 因此,引出 ...

  3. Lua学习笔记(8): 元表

    元表 Lua中提供了元表(Metatable),其实这个元表就比较像面向对象中的类了,可以通过给某些特殊的标识符赋值达到重载的效果,这些特殊的标识符有: 名称 功能 __index 元表的索引方法 _ ...

  4. 教你thinkphp5怎么配置二级域名

    有些项目要将移动端和PC端分离开来,比如访问xxx.com,展示的是PC端的页面.而访问m.xxx.com,展示的是移动端的页面.thinkphp源码需要多多学习,这里记录一下知识点,顺便分享给需要的 ...

  5. Java Basic&Security Tools

    JDK Tools and Utilities Basic Tools These tools are the foundation of the JDK. They are the tools yo ...

  6. Echarts-K线图提示框改头换面

    工作: 使用Hbuilder建web工程,加入echarts相关库,根据需要更改K线图及其的提示样式,去除默认提示,使用异步加载echarts的数据,数据格式为json. 需要注意的K线图和5日均线, ...

  7. lxd&openstack-lxd源码剖析

    lxd:https://linuxcontainers.org/lxd/,目标是融入到openstack体系被管理,像虚拟机一样被管理使用.从如下图可知,并非走的是libvirt-lxc路线,而是no ...

  8. Variable() placeholder() constant() 的区别

    转载来自: http://www.studyai.com/article/33e22cef42274e8a

  9. 兰亭集势股价疯涨背后:物流成外贸B2C发展掣肘

    21世纪经济报道 汤浔芳 北京报道 核心提示:“兰亭集势涨势喜人,这样的增长是这两三年中概股没有出现过的.”一位负责美股投资的基金合伙人告诉记者,此前,中概股比较低迷,持续大幅度上涨,难得一见. 在唯 ...

  10. Transparent Flow Migration for NFV

    Transparent Flow Migration for NFV 摘要 因为SDN提供的灵活性,NF之间存在着流量的迁入和迁出问题.而且NF也要根据相关的状态信息处理数据包,所以流量迁移必须满足以 ...