往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/'
  • 適合一次性導入靜態數據