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...