往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/'
- 適合一次性導入靜態數據
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。