hive 数据导入
这里介绍四种:
(1)、从本地文件系统中导入数据到Hive表;
(2)、从HDFS上导入数据到Hive表;
(3)、从别的表中查询出相应的数据并导入到Hive表中;
(4)、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。
一、从本地文件系统中导入数据到Hive表
先在Hive里面创建好表,如下:
- hive> create table wyp
- > (id int, name string,
- > age int, tel string)
- > ROW FORMAT DELIMITED
- > FIELDS TERMINATED BY '\t'
- > STORED AS TEXTFILE;
- OK
- Time taken: 2.832 seconds
本地文件系统里面有个/home/wyp/wyp.txt文件,内容如下:
- [wyp@master ~]$ cat wyp.txt
- 1 wyp 25 13188888888888
- 2 test 30 13888888888888
- 3 zs 34 899314121
wyp.txt文件中的数据列之间是使用\t分割的,可以通过下面的语句将这个文件里面的数据导入到wyp表里面,操作如下:
- hive> load data local inpath 'wyp.txt' into table wyp;
- Copying data from file:/home/wyp/wyp.txt
- Copying file: file:/home/wyp/wyp.txt
- Loading data to table default.wyp
- Table default.wyp stats:
- [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 67]
- OK
- Time taken: 5.967 seconds
可以到wyp表的数据目录下查看,如下命令:
- hive> dfs -ls /user/hive/warehouse/wyp ;
- Found 1 items
- -rw-r--r--3 wyp supergroup 67 2014-02-19 18:23 /hive/warehouse/wyp/wyp.txt
需要注意的是:Hive并不支持INSERT INTO …. VALUES形式的语句。
二、HDFS上导入数据到Hive表
从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/wyp/),然后再将数据从那个临时目录下移动(注意,这里说的是移动,不是复制!)到对应的Hive表的数据目录里面。既然如此,那么Hive肯定支持将数据直接从HDFS上的一个目录移动到相应Hive表的数据目录下,假设有下面这个文件/home/wyp/add.txt,具体的操作如下:
- [wyp@master /home/q/hadoop-2.2.0]$ bin/hadoop fs -cat /home/wyp/add.txt
- 5 wyp1 23 131212121212
- 6 wyp2 24 134535353535
- 7 wyp3 25 132453535353
- 8 wyp4 26 154243434355
这个文件是存放在HDFS上/home/wyp目录(和一中提到的不同,一中提到的文件是存放在本地文件系统上)里面,我们可以通过下面的命令将这个文件里面的内容导入到Hive表中,具体操作如下:
- hive> load data inpath '/home/wyp/add.txt' into table wyp;
- Loading data to table default.wyp
- Table default.wyp stats:
- [num_partitions: 0, num_files: 2, num_rows: 0, total_size: 215]
- OK
- Time taken: 0.47 seconds
- hive> select * from wyp;
- OK
- 5 wyp1 23 131212121212
- 6 wyp2 24 134535353535
- 7 wyp3 25 132453535353
- 8 wyp4 26 154243434355
- 1 wyp 25 13188888888888
- 2 test 30 13888888888888
- 3 zs 34 899314121
- Time taken: 0.096 seconds, Fetched: 7 row(s)
从上面的执行结果我们可以看到,数据的确导入到wyp表中了!请注意load data inpath ‘/home/wyp/add.txt’ into table wyp;里面是没有local这个单词的,这个是和一中的区别。
三、从别的表中查询出相应的数据并导入到Hive表中
假设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;
- OK
- Time taken: 0.261 seconds
大体和wyp表的建表语句类似,只不过test表里面用age作为了分区字段。对于分区,这里在做解释一下:
分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如wyp表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。
下面语句就是将wyp表中的查询结果并插入到test表中:
- hive> insert into table test
- > partition (age='25')
- > select id, name, tel
- > from wyp;
通过上面的输出,我们可以看到从wyp表中查询出来的东西已经成功插入到test表中去了!如果目标表(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 wyp;
当然,Hive也支持insert overwrite方式来插入数据,执行完这条语句的时候,相应数据目录下的数据将会被覆盖!而insert into则不会,注意两者之间的区别。例子如下:
- hive> insert overwrite table test
- > PARTITION (age)
- > select id, name, tel, age
- > from wyp;
Hive还支持多表插入
- hive> show create table test3;
- OK
- CREATE TABLE test3(
- id int,
- name string)
- Time taken: 0.277 seconds, Fetched: 18 row(s)
- hive> from wyp
- > insert into table test
- > partition(age)
- > select id, name, tel, age
- > insert into table test3
- > select id, name
- > where age>25;
可以在同一个查询中使用多个insert子句,这样的好处是我们只需要扫描一遍源表就可以生成多个不相交的输出
四、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:
- hive> create table test4
- > as
- > select id, name, tel
- > from wyp;
数据就插入到test4表中去了,CTAS操作是原子的,因此如果select查询由于某种原因而失败,新表是不会创建的!
hive 数据导入的更多相关文章
- 利用sqoop将hive数据导入导出数据到mysql
一.导入导出数据库常用命令语句 1)列出mysql数据库中的所有数据库命令 # sqoop list-databases --connect jdbc:mysql://localhost:3306 ...
- Hive数据导入导出的几种方式
一,Hive数据导入的几种方式 首先列出讲述下面几种导入方式的数据和hive表. 导入: 本地文件导入到Hive表: Hive表导入到Hive表; HDFS文件导入到Hive表; 创建表的过程中从其他 ...
- KUDU数据导入尝试一:TextFile数据导入Hive,Hive数据导入KUDU
背景 SQLSERVER数据库中单表数据几十亿,分区方案也已经无法查询出结果.故:采用导出功能,导出数据到Text文本(文本>40G)中. 因上原因,所以本次的实验样本为:[数据量:61w条,文 ...
- sqoop用法之mysql与hive数据导入导出
目录 一. Sqoop介绍 二. Mysql 数据导入到 Hive 三. Hive数据导入到Mysql 四. mysql数据增量导入hive 1. 基于递增列Append导入 1). 创建hive表 ...
- Nebula Exchange 工具 Hive 数据导入的踩坑之旅
摘要:本文由社区用户 xrfinbj 贡献,主要介绍 Exchange 工具从 Hive 数仓导入数据到 Nebula Graph 的流程及相关的注意事项. 1 背景 公司内部有使用图数据库的场景,内 ...
- 从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上
阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并 ...
- 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...
- Hive 实战(1)--hive数据导入/导出基础
前沿: Hive也采用类SQL的语法, 但其作为数据仓库, 与面向OLTP的传统关系型数据库(Mysql/Oracle)有着天然的差别. 它用于离线的数据计算分析, 而不追求高并发/低延时的应用场景. ...
- hive数据导入方法
可以通过多种方式将数据导入hive表 1.通过外部表导入 用户在hive上建external表,建表的同时指定hdfs路径,在数据拷贝到指定hdfs路径的同时,也同时完成数据插入external表. ...
- Hive数据导入
可以通过多种方式将数据导入hive表 1.通过外部表导入 用户在hive上建external表,建表的同时指定hdfs路径,在数据拷贝到指定hdfs路径的同时,也同时完成数据插入external表. ...
随机推荐
- Level/levelup-2-API
https://github.com/Level/levelup Special Notes What happened to db.createWriteStream() levelup(db[, ...
- git地址
登录地址:https://git.oschina.net/signup API地址:http://git.oschina.net/progit/
- 简单说明一下JS中的函数声明存在的“先使用,后定义”
首先看一段JS代码,其中使用了两种方式声明了两个函数,分别在不同的地方调用两个函数: <script> 'use strict'; // 输出hello函数 console.log(hel ...
- winrar 弹窗处理
https://www.rarlab.com/ 1.下载英文版 2.把下面这段code文本复制到一个新建的记事本txt文档中,然后另存为rarreg.key文件,注意后缀名.txt改为.key才行. ...
- Linux下gdb调试(tui)
1 处于TUI模式的GDB 为了以TUI模式运行GDB,可以在调用GDB时在命令行上指定-tui选项,或者处于非TUI模式时在GDB中使用Ctrl+X+A组合键.如果当前处于TUI模式,后一种命令方式 ...
- Template Method(模板方法)模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- element UI 饿了么 UI 分页 按钮不显示的问题
https://blog.csdn.net/sinat_37255207/article/details/88914235 一个很坑的 深坑 element UI 的 按钮 不显示的深坑 <e ...
- Extjs6 怎么重写框架的类
创建一个覆写(override)类的推荐方法如下: Ext.define('MyApp.overrides.panel.Panel', { override: 'Ext.panel.Panel', c ...
- 【Linux】计划任务
计划任务的意义 计划任务 创建和管理在指定时间自动执行的任务 注意事项 要使任务计划在指定时间自动运行,计划任务的服务必须是启动的 计划任务分类 使用at命令调用atd进程设置在某个特定的时间,执行一 ...
- svg图标(svg实现的QQ图标)
与传统的图片相比,用svg实现的图标要更好控制. 比如.若要改变图标的颜色,如果用图片的话,就需要UI设计人员调整图片,而如果用svg的话,就不用那么麻烦,开发人员改样式就行了. 附一个svg实现的Q ...