导入(移动)数据到hive1.1.0表的方法
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表的方法的更多相关文章
- Hive:Spark中如何实现将rdd结果插入到hive1.3.0表中
DataFrame写入hive API: registerTempTable函数是创建spark临时表 insertInto函数是向表中写入数据,可以看出此函数不能指定数据库和分区等信息,不可以直接进 ...
- 在Windows Server2008R2中导入Excel不能使用Jet 4.0的解决方法
一直使用以下代码从Excel中取数据,速度快方便: string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Dat ...
- ssms导入excel数据提示未安装插件的解决方法
今天用ssms导入excel的时候,提示 然后去找了一下解决方案,安装了相对应的插件.但是还是会提示这个问题. 又去找了一下原因,找到一个原因是sqlserver启动的时候是32位的,但是导入需要64 ...
- MySQL 导入外部数据
手工为数据库录入数据: 1 -- 使用数据库 2 use test; 3 4 -- 创建fruits数据表 5 create table fruits( 6 f_id char(10) not nul ...
- VLOOKUP函数将一个excel表格的数据匹配到另一个表中
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)
无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...
- 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库
将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...
- 【BIEE】04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0
有时候,我们往往会存在这样的需求 例如:事实表的数据如下 EMP_FACT表示事实表,DIM_LEVEL是维度表 预期效果:(根据员工信息,分析各等级员工工资与员工个数) 我们在BIEE报表中新建报表 ...
- EXCEL批量导入到Sqlserver数据库并进行两表间数据的批量修改
Excel 大量数据导入到sqlserver生成临时表并将临时表某字段的数据批量更新的原表中的某个字段 1:首先要对EXCEL进行处理 列名改成英文,不要有多余的列和行(通过ctrl+shift 左或 ...
随机推荐
- selenium 图片上传方法。
找到图片上传的input标签: 直接使用send_keys()传值 browser.find_element_by_class_name("upload-pic").send_ke ...
- 用Tensorflow完成简单的线性回归模型
思路:在数据上选择一条直线y=Wx+b,在这条直线上附件随机生成一些数据点如下图,让TensorFlow建立回归模型,去学习什么样的W和b能更好去拟合这些数据点. 1)随机生成1000个数据点,围绕在 ...
- redis与mysql性能对比、redis缓存穿透、缓存雪崩
写在开始 redis是一个基于内存hash结构的缓存型db.其优势在于速读写能力碾压mysql.由于其为基于内存的db所以存储数据量是受限的. redis性能 redis读写性能测试redis官网测试 ...
- eBay推Winit海外仓 鼓励卖家拓展北美市场
[亿邦动力网讯]2月11日消息,日前,跨境电商平台eBay与外贸电商服务商万邑通(Winit)合作,针对平台卖家推出了Winit美国海外仓,鼓励卖家拓展北美市场. 亿邦动力网获悉,Winit美国海外仓 ...
- eclipse版本信息及操作系统
一.查看版本信息: 进入到eclipse安装目录下,有一个.eclipseproduct文件,用记事本打开,就可以知道版本了,后面version=的值就是版本 二.是否为32位操作系统: 找到ecli ...
- 《英文版c++语言程序设计》
compatibility [kəm,pætɪ'bɪlɪtɪ] n.兼容 compatible [kəm'pætɪb(ə)l] adj. 兼容的:能共处的:可并立的 interdependent [ɪ ...
- Spring演示及总结
一.目标 二.分工 三.回顾 发现问题: 第一个冲刺的任务以基本完成,但队友的状态相对有些疲软,主要原因可能是这两周有好几个课程大作业要赶, 有的队友还要为比赛做准备,及做一些其他是项目,时间较紧,有 ...
- 软工实践-Alpha 冲刺 (10/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 完成所有界面的链接,整理与测试 展示GitHub当日代码/ ...
- UVA 11270 轮廓线
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33787 题意: 用1*2或2*1的长条把n*m方格铺满的方案数. ...
- lintcode-507-摆动排序 II
507-摆动排序 II 给你一个数组nums,将它重排列如下形式 nums[0] < nums[1] > nums[2] < nums[3].... 注意事项 你可以认为每个输入都有 ...