Hive并不支持INSERT INTO …. VALUES形式的语句,也不支持针对某些列插入数据形式,
hive操作的是海量文件数据,是没办法区分向那些列插入数据的,
正是因为操作了海量数据,因此无法做到 事务, 循环.
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.txt里面的内容导入到wyp表里面去了,可以到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语句里面直接给出一组记录的文字形式,也就是说,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;
- #####################################################################
- 这里输出了一堆Mapreduce任务信息,这里省略
- #####################################################################
- Total MapReduce CPU Time Spent: 1 seconds 310 msec
- OK
- Time taken: 19.125 seconds
- hive> select * from test;
- OK
- 5 wyp1 131212121212 25
- 6 wyp2 134535353535 25
- 7 wyp3 132453535353 25
- 8 wyp4 154243434355 25
- 1 wyp 13188888888888 25
- 2 test 13888888888888 25
- 3 zs 899314121 25
- Time taken: 0.126 seconds, Fetched: 7 row(s)
这里做一下说明:
我们知道我们传统数据块的形式insert into table values(字段1,字段2),这种形式hive是不支持的。
通过上面的输出,我们可以看到从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;
- #####################################################################
- 这里输出了一堆Mapreduce任务信息,这里省略
- #####################################################################
- Total MapReduce CPU Time Spent: 1 seconds 510 msec
- OK
- Time taken: 17.712 seconds
- hive> select * from test;
- OK
- 5 wyp1 131212121212 23
- 6 wyp2 134535353535 24
- 7 wyp3 132453535353 25
- 1 wyp 13188888888888 25
- 8 wyp4 154243434355 26
- 2 test 13888888888888 30
- 3 zs 899314121 34
- Time taken: 0.399 seconds, Fetched: 7 row(s)
这种方法叫做动态分区插入,但是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 wyp;
更可喜的是,Hive还支持多表插入,什么意思呢?在Hive中,我们可以把insert语句倒过来,把from放在最前面,它的执行效果和放在后面是一样的,如下:
- 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;
- hive> select * from test3;
- OK
- 8 wyp4
- 2 test
- 3 zs
- Time taken: 4.308 seconds, Fetched: 3 row(s)
可以在同一个查询中使用多个insert子句,这样的好处是我们只需要扫描一遍源表就可以生成多个不相交的输出。这个很酷吧!
四、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:
- hive> create table test4
- > as
- > select id, name, tel
- > from wyp;
- hive> select * from test4;
- OK
- 5 wyp1 131212121212
- 6 wyp2 134535353535
- 7 wyp3 132453535353
- 8 wyp4 154243434355
- 1 wyp 13188888888888
- 2 test 13888888888888
- 3 zs 899314121
- Time taken: 0.089 seconds, Fetched: 7 row(s)
数据就插入到test4表中去了,CTAS操作是原子的,因此如果select查询由于某种原因而失败,新表是不会创建的!
hive数据导出方式:
1 找到表对应hdfs文件 通过hdfs dfs -cp src dest方式导出
2 hive>insert overwrite local directory "/root/t3" select * from t3; 将t3表数据导出到linux本地 root/t3文件内
相关推荐
在大数据处理领域,Apache Hive 和 Elasticsearch (ES) 是两种非常重要的工具。Hive 主要用于对存储在 Hadoop 文件系统 (HDFS) 中的大规模数据集进行数据汇总、查询和分析;而 ES 则是一种分布式的、基于文档的搜索...
Hive的元数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。远端存储比较适合生产环境。 1. 使用Derby数据库存储元数据(内嵌的以本地磁盘作为存储),这称为“内嵌配置”。 2. 使用本机Mysql...
这种文件通常被用作Hive的数据源,因为它们可以直接导入到HDFS(Hadoop Distributed File System)上。92168条记录意味着这个数据集相当大,适合进行大规模数据分析。在Hive中,你可以创建外部表指向这个CSV文件,...
Hive的数据存储主要分为两种方式:内部表和外部表。内部表存储在Hive的元数据库中,而外部表存储在HDFS中。Hive还提供了多种数据存储格式,如TEXTFILE、SEQUENCEFILE、ORCFILE等。 Hive基本操作 Hive的基本操作...
元数据库可以使用两种不同的实现方式: - **Derby**:Derby是一种轻量级的嵌入式数据库,主要用于测试和小型项目。Hive默认使用Derby作为元数据库。 - **MySQL**:对于生产环境中的大型部署,通常推荐使用MySQL...
HBase与Hive的数据同步主要有两种常见方式:单向同步和双向同步。 1. 单向同步: - HBase到Hive:通常在需要进行复杂分析时,将HBase中的实时数据导出到Hive,利用Hive的SQL查询能力进行批量处理。这可以通过...
Sqoop支持导入和导出许多Hadoop文件类型,如Hive表、Avro文件、HBase表、Accumulo表等。Sqoop使用JDBC(Java数据库连接)连接到RDBMS,并自动生成一个Java类将数据导入HDFS。Sqoop功能包括导入单个表或数据库中的...
3. **数据加载与导出**:讲解如何将数据导入Hive,包括使用LOAD DATA命令,以及从其他数据源如CSV文件、数据库导入数据。同时,也会涉及如何将Hive数据导出到其他系统。 4. **分区与桶**:讨论如何通过分区和桶优化...
在`hive-sqoop语句.txt`中,可能列出了各种 Sqoop 命令示例,例如导入数据、导出数据,甚至执行复杂的数据库查询。安装时,需要配置数据库连接信息,比如JDBC驱动和数据库连接URL,同时还要确保Hadoop的环境变量已经...
Hive 和 MySQL 是两种在大数据处理领域广泛使用的工具。Hive 是一个基于 Hadoop 的数据仓库工具,可将结构化的数据文件映射为一张数据库表,并提供 SQL 类似的查询语言(HQL)进行数据查询和分析。MySQL 是一个开源...
在大数据处理领域,HBase和Hive是两个重要的组件,它们各自扮演着不同的角色。HBase是一个基于Apache Hadoop的数据存储系统,适用于处理大规模、分布式、实时的数据存储和查询。而Hive则是一个数据仓库工具,它允许...
Hive中的表有两种主要类型:托管表和外部表。托管表的数据存储在Hive的默认数据仓库目录下,由Hive完全管理,当删除表时,数据也会一同被删除。而外部表则不存储在Hive的数据仓库中,它的数据位于用户指定的HDFS路径...
这通常可以通过两种方式实现: 1. **上传数据文件到HDFS**:将原始日志文件上传至HDFS上的指定路径,该路径需与创建表时指定的LOCATION路径一致。 2. **使用LOAD DATA语句**:通过Hive提供的LOAD DATA命令直接将数据...
Hive的数据存储可以分为两种:内部表和外部表。内部表是Hive自己管理的表,外部表是Hive引用的外部数据源。 1.6其它HIVE操作 Hive还提供了一些其他的操作,包括查询语句、数据导出、数据导入等。Hive的查询语句...
- Hive 提供了两种模式:静态分区和动态分区。静态分区在建表时指定分区值,动态分区则在插入数据时根据查询动态生成分区。 7. **Hive 元数据**: - Hive 的元数据(如表结构、分区信息等)存储在 metastore,...
这些工具分别用于数据存储、NoSQL数据库、数据仓库、日志收集和数据导入导出。 2. **数据导入**:将数据文件(如data.txt)复制到Hadoop环境,创建Hive数据库和表结构,字段包括电影ID、名称、投票人数、类型、产地...
标题 "HIVE&&SQOOP" 暗示了我们将探讨两个大数据处理工具,Hive和Sqoop。Hive是基于Hadoop的数据仓库工具,它允许用户使用SQL类查询语言(HQL)来管理和分析存储在Hadoop分布式文件系统(HDFS)中的大量数据。而...
Hadoop是一个开源框架,主要用于分布式存储和计算大规模数据,而Hive则是建立在Hadoop之上的一种数据仓库工具,它提供了一种SQL-like的查询语言(HQL)来处理和分析大数据。下面将详细介绍这两个组件的安装过程以及...