hive表导入数据的几种方式

本文介绍了Hive中数据加载的多种方式,包括使用LOAD DATA命令从本地或HDFS导入数据、通过SELECT查询结果插入到指定表、在创建表时直接插入查询结果、以及将数据文件挂载到Hive表的HDFS目录等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、通过LOAD DATA 命令

1、不指定分区

1)、从本地文件系统中导入数据到Hive表

2)、从HDFS上导入数据到Hive表

2、指定分区

二、把select查询的结果插入到指定的表中

1、静态分区导入

2、动态分区导入

3、多表插入

三、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中create table .. as select

四、把数据文件直接挂载到hive表的hdfs目录下


创建一个简单的hive表

create table test(
id int, name string,tel string)
partitioned by (age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

一、通过LOAD DATA 命令

LOAD DATA (LOCAL )INPATH ... (OVERWRITE) INTO TABLE  tablename

LOCAL :有这个关键字说明是本地的文件,没有的话说明是hdfs上的文件;

OVERWRITE:有这个关键字说明是是覆盖,没有的话是追加;

1、不指定分区

1)、从本地文件系统中导入数据到Hive表

LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE test; 

使用LOCAL代表的是本地目录下的文件

从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/user/),然后再将数据从那个临时目录下移动(注意,这里说的是移动,不是复制!)到对应的Hive表的数据目录里 面。

2)、从HDFS上导入数据到Hive表

而不带LOCAL的则表示使用的是Hadoop上的HDFS上路径下的文件,如

LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE test;

2、指定分区

LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE test PARTITION (ds='2008-08-15');

分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应 的目录中。比如test表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录为/user/hive /warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。

二、把select查询的结果插入到指定的表中

1、静态分区导入

insert into table test partition (age='25') select id, name,tel from test1;

把test1表的数据按照分区age来导入,这种方式称为静态分区;

2、动态分区导入

insert into table test partition (age) select id, name,tel,age from test1;

这种方法叫做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把hive.exec.dynamic.partition.mode设置为 nonstrict。

3、多表插入

Hive还支持多表插入在Hive中,我们可以把insert语句倒过来,把from放在最前面,它的执行效果和放在后面是一样的,如下:

from test
insert into table test1 partition(age)   select id, name, tel, age
insert into table test2   select id, name where age>25;

 

三、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中create table .. as select

在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:

create table test4 as  select id, name, tel from test;

四、把数据文件直接挂载到hive表的hdfs目录下

 

 

 

 

 

### Hive导入数据的方法 在Hive中,将数据导入到空可以通过多种方式实现。以下是几种常见的方法,并结合提供的引用内容进行详细说明。 #### 方法一:从本地文件导入数据 通过 `LOAD DATA` 语句可以将本地文件中的数据直接加载到Hive中。此方法适用于小规模数据集的导入。 ```sql LOAD DATA LOCAL INPATH '/path/to/local/file/t_user.txt' INTO TABLE test_user; ``` 上述命令会将 `/path/to/local/file/t_user.txt` 文件中的数据加载到 `test_user` 中[^1]。需要注意的是,如果使用了 `LOCAL` 关键字,则示从本地文件系统加载数据;否则是从 HDFS 加载数据。 #### 方法二:从其他插入数据 通过 `INSERT INTO` 或 `INSERT OVERWRITE` 语句可以从其他中选择数据并插入到目标中。这种方式适合于大规模数据的迁移或转换。 ```sql INSERT INTO TABLE test_user SELECT id, name FROM source_table; ``` 如果需要覆盖目标中的现有数据,则可以使用 `INSERT OVERWRITE`: ```sql INSERT OVERWRITE TABLE test_user SELECT id, name FROM source_table; ``` 此外,当目标包含分区时,可以在插入语句中指定分区信息[^2]。例如: ```sql INSERT INTO TABLE HiveTest_1 PARTITION(day='2022-07-22') SELECT activity_id, tocc_name, app_key, page, visit_type FROM s_activity_log; ``` #### 方法三:创建外部表并关联数据 创建一个外部表(External Table),并将数据存储路径指向已存在的 HDFS 路径。这种方式适合于数据已经存在于 HDFS 中的情况。 ```sql CREATE EXTERNAL TABLE IF NOT EXISTS ext_student ( s_id INT, s_name STRING, s_birth DATE, s_sex STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/tmp/hive_test/data/student'; ``` 上述命令创建了一个外部表 `ext_student`,并且其数据存储在 HDFS 的 `/tmp/hive_test/data/student` 路径下[^3]。 #### 方法四:解决数据导入后为空的问题 在某些情况下,可能会遇到数据导入后显示为空的问题。这可能是由于 SQL 语句中的逻辑错误导致的。例如,多个通过 `UNION ALL` 合并时,可能存在冲突或不匹配的数据[^5]。因此,在执行复杂查询之前,建议先验证每个子查询的结果是否正确。 另外,确保 Hive 配置参数设置正确,例如动态分区模式和执行引擎配置[^4]: ```sql SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; SET hive.execution.engine=tez; ``` #### 示例代码 以下是一个完整的示例,展示如何从本地文件导入数据Hive中: ```sql -- 创建目标 CREATE TABLE test_user ( id INT, name STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE; -- 导入本地文件数据 LOAD DATA LOCAL INPATH '/root/t_user.txt' INTO TABLE test_user; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值