往hive导入数据的几种方式
往hive导入数据的几种方式
一、导入数据
1. LOAD DATA(最直接、最常用)
-- 从 HDFS 导入(移动文件)
LOAD DATA INPATH 'hdfs_path' [OVERWRITE] INTO TABLE table_name [PARTITION(part_col=value)];
-- 从本地文件系统导入(复制文件到 Hive warehouse)
LOAD DATA LOCAL INPATH 'local_path' [OVERWRITE] INTO TABLE table_name [PARTITION(part_col=value)];
特点:
- INPATH:HDFS路径->文件是被移动到表目录(外部表慎用)
- LOCAL INPATH:本地路径->文件是被复制到hive表目录
- OVERWRITE:覆盖表原有数据,不加则追加
- 适合批量导入文本、CSV、TSV等文件
示例:
-- 从 HDFS 导入
LOAD DATA INPATH '/data/logs/2024-06-01.log' INTO TABLE access_log PARTITION(dt='2024-06-01');
-- 从本地导入
LOAD DATA LOCAL INPATH '/home/user/data.csv' INTO TABLE user_info;
2. INSERT INTO / INSERT OVERWRITE(SQL方式导入)
语法:
-- 从另一张表导入(追加)
INSERT INTO TABLE target_table [PARTITION(...)]
SELECT ... FROM source_table WHERE ...;
-- 覆盖写入
INSERT OVERWRITE TABLE target_table [PARTITION(...)]
SELECT ... FROM source_table WHERE ...;
特点:
- 本质是 Hive SQL查询+写入,会经过MapReduce/Tez/Spark执行
- 适合从Hive 内部表、视图、查询结果导入
- 支持分区动态/静态插入
示例:
-- 动态分区插入
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE sales PARTITION(dt)
SELECT order_id, amount, dt FROM staging_sales;
3. 创建表时直接加载数据(CREATE TABLE AS SELECT)
语法:
CREATE TABLE new_table AS SELECT ... FROM source_table WHERE ...;
特点:
- 一步完成建表和导入
- 适合数据抽取、转换、加载(ETL)
示例:
CREATE TABLE active_users AS
SELECT user_id, last_login FROM users WHERE status='active';
4. 使用Hive外部工具导入
(1) Sqoop(关系型数据库<->hive)
# RDBMS → Hive
sqoop import \
--connect jdbc:mysql://host/db \
--username user --password pass \
--table mysql_table \
--hive-import \
--hive-table hive_db.hive_table \
--create-hive-table \
--fields-terminated-by ',';
(2)Spark / Flink(实时或批流一体导入)
- Spark SQL: df.write.saveAsTable("hive_table")
- Flink SQL: INSERT INTO hive_table SELECT ...
(3)DataX / Kettle(第三方ETL工具) - 配置数据源(Mysql、Oracle、HDFS、hive)进行数据同步
5. 手动上传到HDFS+建表指定Location
- 先用hdfs dfs -put 上传文件到HDFS目录
- 建表时LOCATION '/hdfs/path/'
- 适合一次性导入静态数据
浙公网安备 33010602011771号