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. VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法

    使用VirtualBox复制一份CentOS后重新设置了网卡地址,导致启动网络服务出现下图错误 解决方案 执行命令,查看/etc/udev/rules.d/70-persistent-net.rule ...

  2. Python小白学习之基础知识(个人笔记)

    介绍while else的使用,这个不常用 格式化输出 while esle ,当循环内有break语句时,不执行else语句,当没有break语句时,执行完while循环,然后执行else下面的语句 ...

  3. Appium+python的单元测试框架unittest(3)——discover(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10047906.html) TestSuite套件可以添加很多个用例后运行,但是每个用例都需要调用addTest()函 ...

  4. Openwrt能用的花生壳客户端

    http://files.cnblogs.com/mazhiyong/phddns.zip 使用教程可参考官方文档 http://service.oray.com/question/116.html

  5. 修改Linux系统下的最大文件描述符限制

    通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下: $ulimit -n1024 当然可以通过ulimit -SHn 1024 ...

  6. Jenkins 自动化测试

    学习 Jenkins 自动化测试的系列文章 Robot Framework 概念 Robot Framework 安装 Pycharm + Robot Framework 环境搭建 Robot Fra ...

  7. clone中的浅复制和深复制

    clone:用于两个对象有相同的内容时,进行复制操作. 提示:Java中要想自定义类的对象可以被复制,自定义类就必须实现Cloneable中的clone()方法. 浅复制:另一个对象用clone()方 ...

  8. LearnPython - Zip格式文件的解压缩

    import zipfile import os def unzip(zip_name, target_dir): files = zipfile.ZipFile(zip_name) for zip_ ...

  9. nginx gzip压缩配置

    gzip(GNU-ZIP)是一种压缩技术.经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多.gzip 的压缩页面需要浏览器和服务器双方都支持,实际上就是服务 ...

  10. Scrum立会报告+燃尽图 05

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2195] 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达 ...