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. python--自定义模块

    python模块说明:类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不 ...

  2. (转)使用Python和OpenCV检测图像中的物体并将物体裁剪下来

    原文链接:https://blog.csdn.net/liqiancao/article/details/55670749 介绍 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的 ...

  3. CsvHelper文档-5配置

    CsvHelper文档-5配置 CsvHelper库被设计成快速且简单易用,但是有时候默认的是设置不符合要求,需要你自己改变一些东西.所以csvHelper内置了很多自定义设置选项来改变读写行为.特别 ...

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

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

  5. Python基础灬dict&set

    字典dict 字典使用键-值(key-value)存储,具有极快的查找速度. dict基本操作 取值 a_dict = {'name': 'jack', 'age': 18} print(a_dict ...

  6. Bin Packing 装箱问题——NPH问题的暴力枚举 状压DP

    题目: 给定n(1≤n≤24)个物品,重量分别为wi,装进一些容量为S(S<1e8)的背包,最少需要多少个背包?

  7. varnish squid nginx比较

    linux运维中,web cache server方案的部署是一个很重要的环节,选择也有很多种比如:varnish.squid.nginx.下面就对当下常用的这几个web cache server做一 ...

  8. PHPDoc 学习记录

    https://zh.wikipedia.org/wiki/PHPDoc PHPDoc 是一个 PHP 版的 Javadoc.它是一种注释 PHP 代码的正式标准.它支持通过类似 phpDocumen ...

  9. 使用C和C++实现“电梯”的区别

    C 面向过程:       该电梯不允许未卜先知,故程序需逐条处理乘客请求并更新当前各变量状态.       如何获得最短时间:是否立即响应请求,计算出不同决策下的总时间,并进行比较,然后选择最短时间 ...

  10. 【树上DFS】Tree and Polynomials

    http://codeforces.com/gym/101372 D push1[i][k]:所有操作1总共要让节点i下推多少系数k push2[i][k]:所有操作2总共要让节点i上推多少系数k s ...