需求和遇到的問題
現在手裡要做一些資料統計,本來使用的是ignite,但是發現挺慢的,可能是我的本本配置太低了,執行一條語句得很久.所以還是使用hive來進行統計.但是在載入資料的時候總是會出現上傳的數資料被移動.看了很多部落格,也算知道了原因,記錄一下採坑的過程
資料如果在本地,直接load的時候加上local關鍵字
資料如果在hdfs 上在建立表的時候指定location " 檔案路徑目錄"
建立測試表
drop table if exists yaocao.dicttest;
create table yaocao.dicttest (
bccdoe string,
customercode string ,
bcountrycode string
)row format delimited fields terminated by '\t';
測試一:將乙份資料放在伺服器的/root/hstest 目錄下 沒有上傳到hdfs上
load data inpath "/root/hstest/dicttest.txt" into table yaocao.dicttest;
結果
出現no files matching path hdfs:的錯誤
意思是在hdfs的這個路徑下沒有匹配到檔案 說明如果load檔案不加local 引數的時候,inpath預設使用的是hdfs的路徑.
我們先不把資料上傳到hdfs 加上local關鍵字看可不可以載入進去.
load data local inpath "/root/hstest/dicttest.txt" into table yaocao.dicttest;
結果插入成功了.
而且資料也沒有發生移動,還是在/root/hstest/
這樣也算是解決了我的問題.
但是我又想,資料一般不會再我的本地磁碟放著,最後可定是要放在hdfs上的.如果在hdfs上的資料又會如何呢?
首先將資料put到hdfs上
hadoop fs -put /root/hstest/dicttest.txt /hstest/
檢視是否上傳上去
hadoop fs -ls /hstest/
結果如下,可以看到資料已經存在於hdfs上了.
下面開始操作.首先將原來建立的表給刪了
drop table dicttest;
再重新建立表(是不是腦子有問題,剛刪了,又建立,這不是為了驗證麼,要有耐心)
建立語句還是上面的沒有變.
drop table if exists yaocao.dicttest;
create table yaocao.dicttest (
bccdoe string,
customercode string ,
bcountrycode string
)row format delimited fields terminated by '\t';
然後是載入資料.這裡我們首先還是不加任何,直接load
load data inpath "/hstest/dicttest.txt" into table yaocao.dicttest;
結果顯示載入成功了
那麼我的資料還在hdfs 的 /hstest 目錄下麼?
很顯然,dicttest.txt那個檔案不見了.我很傷心.他去**了呢?
當然是跑到hive配置的目錄下了,我沒記錯應該是在hive-site.xml
這個檔案中指定的.我去瞅瞅配置在**了.
vim hive-site.xml
不過可惜,我在裡面沒發現有這個設定的.好像是預設的(預設的位置是在/user/hive/warehouse
下 ),不過可以配置,你可以加這個屬性,然後配置目錄
hive.metastore.warehouse.dir
這是我後來查詢到的;
3)修改default資料倉儲原始位置(將hive-default.xml.template如下配置資訊拷貝到hive-site.xml檔案中)。
hive.metastore.warehouse.dir
/user/hive/warehouse
location of default database for the warehouse
配置同組使用者有執行許可權
bin/hdfs dfs -chmod g+w /user/hive/warehouse
姑且就這麼著吧.我去hdfs的這個目錄下看看有沒有就可以了
hadoop fs -ls /user/hive/warehouse/yaocao.db
果然讓我找到了,說明我在load 的時候資料被直接再到這裡.那麼怎麼可以讓他不移動呢?
於是我又把這個表給刪了,而且發現在/user/hive/warehouse/yaocao.db 這個目錄下的dicttest.txt也沒了.(這裡又好像是乙個知識點.內部表和外部表的區別,這個可以後面有時間再說)
就是在建立表的時候將資料的位置指定.
所以我的建表語句這次終於有變化了.
drop table if exists yaocao.dicttest;
create table yaocao.dicttest (
bccdoe string,
customercode string ,
bcountrycode string)
row format delimited fields terminated by "\t"
location "/hstest" ;
通過上面的建表語句是可以實現建表並將資料匯入,而且資料的位置沒有移動.
但是有乙個很難受的問題就是我的檔案是在/hstest/下的dicttest.txt , 如果我在這個檔案下面還有其他檔案,那他不是都給我載入進去了. 這個問題暫時沒有結果.
其實,在我查閱資料的過程中發現,通過第二種這種方式直接載入資料很少,大多數都是建好表,然後通過load 方式將資料匯入進去,雖然資料移動了,但是不影響,只是換了乙個儲存的位置而已.
hive 建庫建表插入資料
hive 建庫建表插入資料 先上傳檔案 sftp put users chenxin downloads hql50 hql50 score.txt root data hql50 sftp put users chenxin downloads hql50 hql50 teacher.txt ro...
hive建表 匯入資料 匹配
1.建表 建立非重複表,分隔符設定為 create table if not exists imei guid imei string row format delimited fields terminated by 2.匯入 將本地資料夾的資料上傳到hive,適用資料量較大情況 concaten...
hive建庫建表與資料匯入匯出
hive建表 hive分內部表與外部表,建立內部表時,會將資料移動到資料倉儲指向的路徑 若建立外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變。在刪除表的時候,內部表的元資料和資料會被一起刪除,而外部表只刪除元資料,不刪除資料。這樣外部表相對來說更加安全些,資料組織也更加靈活,方便共享源資料。...