hive的load踩過的坑

2021-09-26 04:32:42 字數 2391 閱讀 6630

load:

hive中load命令的使用語法

load data [local] inpath 'filepath' [overwrite] into table tablename [partition (partcol1=val1, partcol2=val2 ...)]
'local'表示輸入檔案在本地檔案系統上。如果'local'被省略,那麼它會在hdfs中查詢該檔案。

關鍵字'覆蓋'表示表中的現有資料被刪除。如果忽略'overwrite'關鍵字,則將資料檔案附加到現有資料集。

注意:

描述:

使用帶'local'關鍵字的load命令,想從本地匯入資料到hive表中,但是執行報錯:no files matching path file

報錯找不到檔案,但確定當前機器確實存在這個檔案。

分析:

期初懷疑是許可權或者使用者不對,導致找不到檔案。然後chmod、chown了一波,並沒有卵用,問題不在這。

搜素解決了問題,分析為:hive匯入資料語句  load data [local] inpath ,是乙個伺服器端的指令,它是在伺服器端執行。因此指定local時表明載入的檔案為本地檔案,但是這裡的local,在hive中指的是 hiveserver 服務所在的機器,而不是hivecli 或 beeline客戶端所在的機器(生產環境大都是 hiveserver 和 hivecli不在同乙個機器)。

方法:

把要載入的檔案上傳到 hiveserver所在的伺服器(這一般是不可能的事情),然後執行  load data local inpath [path] [overwrite] into table table_name.

先將本地檔案上傳至hdfs,然後使用 load data inpath [hdfspath] [overwrite] into table table_name。

推薦使用第二種方法

hadoop dfs -mkdir /input

hdfs dfs -ls /input #剛建的資料夾下沒有檔案

hadoop fs -put test.txt /input

hdfs dfs -ls /input #可以看到檔案下有剛上傳的檔案

#在hive中執行load命令

oad data inpath [hdfspath] [overwrite] into table table_name

hdfs dfs -ls /input #資料夾下的檔案發生了移動

乙個參考的好連線:

描述:

匯入到hive中的表資料大量為null,只有第乙個欄位和分割槽欄位有資料,其他欄位全為null。

分析:

我在關係型資料庫oracle匯出的資料中每個資料字段的文字限定符為雙引號(每個欄位用雙引號包圍),字段分隔符(字段分隔符)為逗號。但是hive中的表第乙個資料字段為string,後面欄位不為string。所以只是第乙個字段型別一致,也只有它可以匯入資料,其它字段型別不匹配,全部為null。

方法:

重新超出oracle資料,文字限定符為「無」,字段分隔符為「定位」(文字中為^i)。

在hive中執行命令:show create table test_table_name; 可以看到建表指令碼和行列分隔符等資訊。

修改資料檔案的分隔符,替換為^a

cat -a test.txt #可以看到分隔符為^i

set -i 's/ /^a/g' test.txt #test.txt原本的分隔符為^i(按「ctrl+v,ctrl+i」可以輸出),^a(按「ctrl+v,ctrl+a」可以輸出)

cat -a test.txt #可以看到分隔符為^a

在hive中執行load命令。

描述:

經過幾次踩坑之後資料可以匯入到hive中了,但是仔細一看hive表的timestamp型別的字段全部為null。

分析:

在hive中提供了字段型別timestamp,但其對應的時間格式為yyyy-mm-dd hh:mm:ss,即通過load命令將文字載入到已建立的表中時,只有滿足上述格式的內容才可以被正確解析,否則只能識別為null。

而我匯出的資料時間格式的日期格式符為「/」。

方法:

重新從oracle中匯出資料,注意日期格式符修改為「-」。

重新load

經過一波操作終於可以匯入資料進hive表中。

hive踩過的小坑

上週使用hive做一些操作,幾個小問題糾結很久。特此記錄下 hive是基於hadoop的乙個資料倉儲工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為mapreduce任務進行執行。其優點是學習成本低,可以通過類sql語句快速實現簡單的mapreduc...

git踩過的坑

4.git 修改當前的project的使用者名稱的命令為 git config user.name 你的目標使用者名稱 git 修改當前的project提交郵箱的命令為 git config user.email 你的目標郵箱名 如果你要修改當前全域性的使用者名稱和郵箱時,需要在上面的兩條命令中新增...

springboot踩過的坑

設定上下文路徑context path不生效 springboot 2.0之前的語法 server.context path xx 2.0之後的語法 server.servlet.context path xx 在配置yml時,報錯如下 caused by org.yaml.snakeyaml.sc...