1. 程式人生 > >hive的資料修改更新問題解決

hive的資料修改更新問題解決

由於hive是一個數據倉庫。是一個基於日誌的分析和統計。底層的資料應該是穩定的,與oracle不同的是,資料不是經常變化的。但是在日常的業務中經常有修改資料的需求。有的資料是經常變化的。需要維護一個經常變化的表。我通過一些專案,總結了一下幾個方法:

1 如果資料量不大,可以嘗試週期的覆蓋原始資料的方法。根據需求,對資料進行週期的更新,再匯入的時候對資料進行覆蓋操作。

2 對資料庫的資料或者日誌進行一個更新日期的欄位標註。如果資料量很大,那麼就每天匯入最新的資料。當然這樣就是有一條資料,不同的更新日期的資料。這樣在查詢的時間取最新的時間進行統計。這樣可以根據更改時間,解決資料更新的需求。維護一個最新的狀態。

 一下是第一種方案的例子:

載入資料到表時,hive不會做任何轉換。載入操作是純粹的複製/移動操作,移動資料檔案到相應的hive表。

語法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

例項

假設hive的warehouse目錄是/user/hadoop/warehouse,這裡有一個login表

複製程式碼
CREATE TABLE login (
  uid  BIGINT,
  ip  STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
複製程式碼

對應有一個使用者登入日誌檔案,檔案內容如下:

888,8.8.8.8
999,9.9.9.9

注意,列與列之間是用','號隔開,第一列是uid,第二列是使用者ip。

接著載入資料

LOAD DATA LOCAL INPATH '/data/login/20130101.csv' OVERWRITE INTO TABLE login PARTITION (dt='20130101');

這表示從本地磁碟,把檔案 '/data/login/20130101.csv' 拷貝到表login,分割槽dt為'20130101'的目錄(在HDFS)下.載入成功後,20130101.csv會放置在 hdfs://namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

OVERWRITE表示目標表(或分割槽)在資料載入前會刪除,然後替換為新的資料。如果不指定OVERWRITE,則會追加資料到目標表(或分割槽)下,如果檔名和目標目錄的檔案衝突,會自動改名。

LOCAL如果不指定,就是從HDFS的'/data/login/20130101.csv'移動資料到表login,分割槽分割槽dt為 '20130101'的目錄下。即是,原來的HDFS檔案'/data/login/20130101.csv'是被移動到hdfs: //namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

注意:載入的檔名不能是一個子目錄,hive做一些最簡單的檢查,以確保正在載入的檔案和目標表匹配。目前,它會檢查,如果該表儲存為sequencefile格式 - 正在載入的檔案是反序列化。