2、hive导入、导出、删除

本文详细介绍了Hive中的四种常见数据导入方法,包括从本地文件系统、HDFS、其他表查询导入以及创建表时直接插入数据。此外,还介绍了三种数据导出方式:导出到本地文件系统、HDFS及Hive的另一个表中。
一、Hive的几种常见的数据导入方式
(插入过程中,不做源数据检测,即:什么数据都可以插入,只是查询时会报空值)
这里介绍四种:
(1)从本地文件系统中导入数据到Hive表;
(2)从HDFS上导入数据到Hive表;
(3)从别的表中查询出相应的数据并导入到Hive表中;
(4)在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中

[hadoop@h91 hive-0.9.0-bin]$ bin/hive 进入hive模式
1.从本地文件系统中导入数据到Hive表
1.1:创建ha表
hive> create table ha(id int,name string)
> row format delimited --关键字,设置创建表的时候支持分隔符
> fields terminated by '\t' --关键字,定义分隔符类型
> stored as textfile; --关键字,设置加载数据的数据类型是文本文档(txt格式)

[ROW FORMAT DELIMITED]关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符。
[STORED AS file_format]关键字是用来设置加载数据的数据类型,默认是TEXTFILE,如果文件数据是纯文本,就是使用 [STORED AS TEXTFILE],然后从本地直接拷贝到HDFS上,hive直接可以识别数据。

1.2:操作系统中的文本
[hadoop@h91 ~]$ vim haha.txt
101 zs
102 ls
103 ww

1.3:导入数据
hive> load data local inpath '/home/hadoop/haha.txt' into table ha;
hive> select * from ha;

和我们熟悉的关系型数据库不一样,Hive是非关系型数据库,现在还不支持在insert语句里面直接给出一组记录的文字形式,也就是说,Hive并不支持INSERT INTO …. VALUES形式的语句。

2.从HDFS上导入数据到Hive表;
2.1:在文件系统中创建文件,并上传到hdfs集群中
[hadoop@h91 ~]$ hadoop fs -mkdir abc
[hadoop@h91 ~]$ vim hehe.txt
1001 aa
1002 bb
1003 cc
[hadoop@h91 ~]$ hadoop fs -put hehe.txt /user/hadoop/abc (上传到 hdfs中)

2.2:创建表
hive> create table he(id int,name string)
> row format delimited
> fields terminated by '\t'
> stored as textfile;

2.3:导入数据
hive> load data inpath 'hdfs://h101:9000/user/hadoop/abc/hehe.txt' into table he;

3.从别的表中查询出相应的数据并导入到Hive表中
3.1:查询原始表格,并创建新表格
hive> select * from he;
OK
1001 aa
1002 bb
1003 cc

hive> create table heihei(id int,name string)
> row format delimited
> fields terminated by '\t'
> stored as textfile;

3.2:把原始表中的数据查询并插入到新表格中
hive> insert into table heihei select * from he; --0.9之后的版本可以使用into
hive> insert overwrite table heihei select * from ha; --0.9之前的版本不能使用into,只能使用overwrite(insert overwrite 会覆盖数据)

4.在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
hive> create table gaga as select * from he;

==============================
二、导出数据
(1)导出到本地文件系统;
(2)导出到HDFS中;
(3)导出到Hive的另一个表中。

1.导出到本地文件系统:
hive> insert overwrite local directory '/home/hadoop/he1' select * from he;

[hadoop@h91 ~]$ cd he1(he1为目录,目录下有000000_0文件 )
[hadoop@h91 he1]$ cat 000000_0
(发现 列之间没有分割 )

可以下面的方式增加分割
hive> insert overwrite local directory '/home/hadoop/he1' select id,concat('\t',name) from he;

和导入数据到Hive不一样,不能用insert into来将数据导出

2.导出到HDFS中。
hive> insert overwrite directory '/user/hadoop/abc' select * from he;
(/user/hadoop/abc 为hdfs下目录)

[hadoop@h91 hadoop-0.20.2-cdh3u5]$ bin/hadoop fs -ls abc
[hadoop@h91 hadoop-0.20.2-cdh3u5]$ bin/hadoop fs -cat abc/000000_0

3.导出到Hive的另一个表中
hive> insert into table he12 select * from he;

==============================
三、删除数据
1.在hadoop集群中删除文件即可实现删除表中数据
既然已经知道导入数据是通过文件导入,或者是表格导入,只需要在hadoop集群中删除相应的导入的数据文件即可

[hadoop@h101 ~]$ hadoop fs -lsr /user/hive/warehouse
drwxr-xr-x - hadoop supergroup 0 2017-08-23 18:42 /user/hive/warehouse/two
-rw-r--r-- 2 hadoop supergroup 27 2017-08-23 18:39 /user/hive/warehouse/two/000000_0
-rw-r--r-- 2 hadoop supergroup 27 2017-08-23 18:40 /user/hive/warehouse/two/a.txt
-rw-r--r-- 2 hadoop supergroup 27 2017-08-23 18:42 /user/hive/warehouse/two/b.txt

<think> 我收到了用户的查询:“我想查找hive数据库导出导入的方法 请问hive数据库导出导入的方法”。用户明确要求了解Hive的数据导入导出方法。 根据系统级指令,我需要使用中文回答,确保所有数学表达式格式正确,并在回答中自然地添加引用标识。回顾之前的引用,特别是引用[3]提到Hive的4种导入和3种导出方式,引用[4]提供了导入命令的基本语法,引用[5]列举了不同数据库的导入导出命令包括Hive的部分。 用户的需求是全面的汇总,所以我必须覆盖多种场景: - 导入方面:包括从本地文件系统、HDFS、其他Hive导入数据 - 导出方面:包括导出到本地文件系统、HDFS、其他数据库 我将从导入方法开始构建回答。引用[4]的关键命令是基础:`LOAD DATA [LOCAL] INPATH ... INTO TABLE ...`,其中`LOCAL`关键字区分本地和HDFS路径。需要解释临时复制和移动机制,如引用[3]所述。 然后扩展到其他导入方式: - 使用`INSERT`语句从查询导入,适用于数据转换 - 外部表关联,如引用[2]提到的ODS层全量导入场景 - Sqoop工具,用于关系型数据库如MySQL到Hive导入 导出方法部分: - `INSERT OVERWRITE [LOCAL] DIRECTORY ...`命令是核心,基于引用[4]和[5] - 导出到其他数据库需结合工具如Sqoop - 强调导出本质是HDFS文件操作 最后总结最佳实践,提醒用户注意覆盖模式和权限问题。整个过程需保持逻辑清晰,分步骤说明。 相关问题设计需围绕用户可能的需求延伸: 1. 性能优化:大数据量下的导入导出效率 2. 增量场景:与全量导入的区别 3. 复杂导出:如压缩或自定义格式处理 4. 错误处理:失败时的调试方法 确保回答结尾添加引用标识,如[^3][^4][^5],对应关键命令和机制说明。 现在组织内容:先分导入导出两大部分,每部分列出具体方法并附示例命令,保持语言简洁专业。 </think> 以下是Hive数据库数据导入导出的详细方法总结,综合实际应用场景和最佳实践: ### 一、数据导入方法 1. **从本地文件系统导入** ```sql LOAD DATA LOCAL INPATH '/path/to/local/file.txt' [OVERWRITE] INTO TABLE table_name [PARTITION (partcol=val)]; ``` - `LOCAL`:指定本地路径(无`LOCAL`则默认为HDFS路径) - `OVERWRITE`:覆盖表原有数据(省略则追加) - 过程:文件先复制到HDFS临时目录,再移动到Hive表目录[^3][^4] 2. **从HDFS直接导入** ```sql LOAD DATA INPATH 'hdfs://path/to/hdfs/file.csv' INTO TABLE table_name; ``` - **本质是移动操作**:原HDFS文件会被删除[^3] 3. **查询结果导入(ETL常用)** ```sql INSERT [OVERWRITE | INTO] TABLE target_table SELECT * FROM source_table WHERE condition; ``` - 支持复杂转换和过滤逻辑 4. **外部表关联(免移动数据)** ```sql CREATE EXTERNAL TABLE ext_table (col1 INT) LOCATION 'hdfs://path/to/data/'; ``` - 数据保留在原位置,仅建立元数据映射[^2] 5. **Sqoop从关系数据库导入** ```bash sqoop import --connect jdbc:mysql://db_ip/db_name \ --table source_table --hive-import --target-dir /hdfs/path ``` - 支持MySQL/Oracle等数据库到Hive的增量同步[^5] ### 二、数据导出方法 1. **导出到本地文件系统** ```sql INSERT OVERWRITE LOCAL DIRECTORY '/local/output/path' SELECT * FROM table_name; ``` 2. **导出到HDFS** ```sql INSERT OVERWRITE DIRECTORY 'hdfs://output/path' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM table_name; ``` 3. **导出到其他数据库** - **Sqoop导出示例(到MySQL)**: ```bash sqoop export --connect jdbc:mysql://db_ip/db_name \ --export-dir /hive/table/hdfs/path --table target_table ``` - **其他数据库语法**(如Gbase/ClickHouse)见引用[^5] 4. **直接拷贝HDFS文件** ```bash hadoop fs -get /hive/warehouse/table_path /local/path ``` - 适用于原始格式导出[^3] ### 三、关键注意事项 1. **权限控制**:HDFS目录需有读写权限(`hadoop fs -chmod`) 2. **数据格式**:文本文件需指定分隔符(`FIELDS TERMINATED BY '\t'`) 3. **分区表**:导入时需明确分区值,导出自动按分区生成子目录 4. **性能优化**: - 大文件比小文件导入效率更高 - 导出时启用压缩(`SET hive.exec.compress.output=true;`) > 示例:将CSV从HDFS导入分区表并导出到本地 > ```sql > -- 导入 > LOAD DATA INPATH '/data/user_logs.csv' > INTO TABLE logs PARTITION (dt='2023-10-01'); > > -- 导出 > INSERT OVERWRITE LOCAL DIRECTORY '/backup/logs_20231001' > SELECT * FROM logs WHERE dt='2023-10-01'; > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值