overwrite在hive内部表及外部表特性。overwrite即为重写的意思, 指定了OVERWRITE,会有以下效果:
•目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。
•如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。
•目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。
•如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。
一、内部表测试
1. 内部表建表语句:
create table tb_in_base
(
id bigint,
devid bigint,
devname string
) partitioned by (job_time bigint) row format delimited fields terminated by ',';
create table tb_in_up
(
id bigint,
devid bigint,
devname string
) partitioned by (job_time bigint) row format delimited fields terminated by ',';
2. 以下为load overwrite 相关测试
测试数据:
[hadoop@mwtec-50 tmp]$ vi tb_in_base
1,121212,test1,13072912
2,131313,test2,13072913
3,141414,test3,13072914
4,151515,test5,13072915
5,161616,test6,13072916
6,171717,test7,13072917
导入hdfs:
hadoop fs -put /tmp/tb_in_base /user/hadoop/output/
tb_in_base表数据导入:
load data inpath '/user/hadoop/output/tb_in_base' into table tb_in_base partition(job_time=030729);
不使用overwrite新增加一条记录:
[hadoop@mwtec-50 tmp]$ vi t1
7,181818,test8,13072918
导入hdfs:
hadoop fs -put /tmp/t1 /user/hadoop/output/t1
导入tb_in_base表:
发现新增一条id为7的记录
测试数据:
[hadoop@mwtec-50 tmp]$ vi t2
8,191919,test9overwrite,13072918
导入hdfs: hadoop fs -put /tmp/t1 /user/hadoop/output/t1
使用overwrite导入:
1. 导入不同分区:
load data inpath '/user/hadoop/output/t2' overwrite into table tb_in_base partition(job_time=030730);
导入后结果:
2. 导入相同分区:
load data inpath '/user/hadoop/output/t2' overwrite into table tb_in_base partition(job_time=030729);
导入后结果:
注:注意区分load data local inpath 及 load data inpath区别。
3. 测试 insert into 与 insert overwrte 区别
查询tb_in_up目前为空表。
将tb_in_base内部表的数据,通过insert into 到内部表tb_in_up中。
insert into table tb_in_up partition (job_time=030729) select id,devid,devname from tb_in_base limit 1 ;
注:hive的默认数据是default,故有defalult.tb_in_up
执行后查询结果:
再次执行 insert into table 语句:
insert into table tb_in_up partition (job_time=030729) select id,devid,devname from tb_in_base where id <3 ;
执行后结果新增加id为1、2两条记录:
使用overwrite table 测试:
执行语句:
insert overwrite table tb_in_up partition (job_time=030729) select id,devid,devname from tb_in_base where id >3 and id<6 ;
执行过程:
执行结果:
导入其他分区:
执行语句:
insert overwrite table tb_in_up partition (job_time=030730) select id,devid,devname from tb_in_base where id >3 and id<6 ;
操作过程:
执行结果:
结果分析: 使用insert into table 数据只做增加操作;使用insert overwrite table 将删除当前指定的数据存储目录的所有数据(即只会删除指定分区数据不会删除其他分区的数据),再导入新的数据。
二、mysql 外部表测试
1. 内部表建表语句:
--hive建表语句:
CREATE EXTERNAL TABLE tb_in_mysql(
developerid int,
productid int,
dnewuser int
) row format delimited fields terminated by ',';
CREATE EXTERNAL TABLE tb_mysql(
developerid int,
productid int,
dnewuser int
)
STORED BY 'com.db.hive.mysql.MySQLStorageHandler' WITH SERDEPROPERTIES ("mapred.jdbc.column.mapping" = "developerid,productid,dnewuser" )
TBLPROPERTIES (
"mapred.jdbc.input.table.name" = "tb_mysql",
"mapred.jdbc.onupdate.columns.ignore" = "developerid,productid",
"mapred.jdbc.onupdate.columns.sum" = "dnewuser",
"mapred.jdbc.url" = "jdbc:mysql://192.168.241.94:3307/db",
"mapred.jdbc.username" = "db",
"mapred.jdbc.password" = "db"
);
--mysql建表语句
CREATE TABLE tb_mysql (
`developerid` int(11) NOT NULL DEFAULT '0',
`productid` int(11) NOT NULL DEFAULT '0',
`dnewuser` int(11) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
测试数据:
1,1212,10
2,1313,9
3,1414,13
4,1515,50
5,1616,70
6,1717,80
7,18818,100
导入hdfs:
hadoop fs -put /tmp/tb_mysql /user/hadoop/output/
导入hive表:
load data inpath '/user/hadoop/output/tb_mysql' into table tb_in_mysql;
使用insert into table 往外部表tb_mysql写入数据:
insert into table tb_mysql select developerid,productid,dnewuser from tb_in_mysql where developerid=1;
执行过程:
执行结果:
mysql> select * from tb_mysql;
+-------------+-----------+----------+
| developerid | productid | dnewuser |
+-------------+-----------+----------+
| 1 | 1212 | 10 |
+-------------+-----------+----------+
1 row in set
再次执行以下步骤:
insert into table tb_mysql select developerid,productid,dnewuser from tb_in_mysql where developerid=2;
执行结果:
mysql> select * from tb_mysql;
+-------------+-----------+----------+
| developerid | productid | dnewuser |
+-------------+-----------+----------+
| 1 | 1212 | 10 |
| 2 | 1313 | 9 |
+-------------+-----------+----------+
2 rows in set
使用overwrite 进行测试:
insert into table tb_mysql select developerid,productid,dnewuser from tb_in_mysql where developerid=5;
执行过程:
执行结果:
mysql> select * from tb_mysql;
+-------------+-----------+----------+
| developerid | productid | dnewuser |
+-------------+-----------+----------+
| 1 | 1212 | 10 |
| 2 | 1313 | 9 |
| 3 | 1414 | 13 |
| 5 | 1616 | 70 |
+-------------+-----------+----------+
结果分析:
在外部表中使用into table 与overwrite table 效果一致
额外测试:overwrite table是否会更新数据
测试结果:overwrite table 不更新mysql内容。
使用into table 进行测试是否会更新mysql数据
语句:
insert into table tb_mysql select developerid,1111111 as productid,dnewuser from tb_in_mysql where developerid=5;
Total MapReduce jobs = 1
执行过程:
执行结果:
测试结果:into table 不更新mysql结果表内容。
分析结果:
内部表:
1. insert intotable 指定相同分区可以进行不断的写入新数据,指定不同分区也可写入新数据。
2. insertoverwrite table 指定相同分区会先将之将的数据旧删除,再进行写入新数据;指定不同的分区则直接写入新数据。
3. 使用load data 数据只会增加当前表的数据;使用load dataoverwrite将删除当前指定的数据存储目录的所有数据(即只会删除指定分区数据不会删除其他分区的数据),再导入新的数据。
mysql 外部表:
使用insert into table 与insert overwritetable 不会修改旧数据,只会将新数据直接写入数据库。
相关推荐
内部表的删除会同时移除数据和元数据,而外部表只移除元数据,数据保持不变。 7. **加载数据**: Hive提供了`LOAD DATA`命令来加载数据到表中。`LOAD DATA LOCAL INPATH`可以从本地文件系统加载数据,`LOAD DATA ...
在Hive中,内部表由Hive自身管理,数据存储在HDFS中。实验中创建了一个名为`stocks`的内部表,字段分隔符为英文逗号。表结构包括`exchange`、`symbol`、`ymd`、`price_open`、`price_high`、`price_low`、`price_...
- Hive内部使用MapReduce来执行查询。 #### 八、使用Hive注意事项 - **字符集问题**:在处理文本数据时需要注意字符集的匹配。 - **压缩**:合理选择压缩算法可以显著减少存储空间和提高查询性能。 - **COUNT...
- 使用 `CREATE TABLE AS SELECT` 创建的表是内部表,不能用于外部表。 17. **临时表**: - 临时表只在当前会话可见,关闭会话后会消失。 18. **修改表/重命名**: - Hive 提供了 RENAME TABLE 命令来更改表名...
自建落地表为什么要自建落地表HIVE SQL创建内/外部表、分区表insert overwrite 向分区表插入数据 为什么要自建落地表 1、公司的大数据资源非常紧张, 2、导数逻辑很复杂; 3、日常导数要求时效性高; 4、部门数仓的...
内部表的数据存储在Hive内部管理,而外部表的数据存储在HDFS上的指定位置,Hive仅管理元数据。分区表则可以通过国家等字段进行数据划分。 - 加载数据:可以使用`LOAD DATA`命令从本地文件系统(如`student_local`)...
- **外部表**:与内部表不同,外部表的数据存储位置可以在HDFS上的任何位置,这使得外部表在数据加载时更为灵活。 - **分区**:为了提高查询性能,可以基于某个列值将表划分为多个分区。每个分区包含表的一部分...
内部表由Hive负责数据的生命周期,而外部表只管理元数据,数据存放在用户指定的HDFS路径。表可以带有注释,也可以被分区或分桶,例如`PARTITIONED BY`和`CLUSTERED BY`。`ROW FORMAT`则定义了数据的分隔符和序列化...
1. **创建表**:Hive支持多种表类型,包括内部表和外部表。内部表的数据由Hive管理,而外部表的数据则由用户管理。创建表的基本语法如下: ```sql CREATE TABLE table_name (col1 type1, col2 type2, ...) ROW ...
- 外部表与内部表的主要区别在于数据的生命周期管理,外部表仅管理元数据,数据由用户自行管理。 通过以上介绍,我们可以看到 Hive 是一个强大的数据处理工具,提供了灵活的 SQL 查询接口,使得非程序员也能方便地...
《阿里巴巴Hive学习笔记》是基于阿里巴巴内部分享的资料,主要涵盖了Hive的基本结构、与Hadoop的关系、元数据库管理以及基本操作等方面,为初学者提供了深入理解Hive的全面指南。 1. **Hive结构** - **Hive架构**...
- **创建内部表**:内部表的数据由Hive直接管理,删除表时会同时删除数据。 - **创建外部表**:外部表的数据独立于表存在,即使删除表,数据也不会被删除。 - **创建分区表**:用于存储按不同键值划分的数据。 - **...
假设有一个按`sale_id`有序的`t_sale`表,可以创建一个外部表`range_keys`来存储区间文件。 ```sql CREATE EXTERNAL TABLE range_keys(sale_id int) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2....
- 内部表:默认创建的表类型,数据存储在 HDFS 的特定目录下。 - 外部表:创建时需要显式指定位置,数据不会随表一起删除。 - **数据加载**:支持从本地文件系统加载数据到 HDFS,或直接从 HDFS 加载数据到表中。 ...
- 创建外部表不会移动数据文件,仅保存数据路径。 - Hive 需要在启动前配置依赖服务,如 HDFS。 8. 填空题答案: - 数据仓库、分区 - 主题、非易失 - 3 - HDFS、转换 - clustered by - 处理 以上内容详细...