hive在進行數據load的時候報錯。
Error: EXECUTION FAILED: Task MOVE error HiveException: [Error 20531] Unable to move source hdfs://nameservice1/tmp/logs to destination hdfs://nameservice1/inceptor1/user/hive/warehouse/test_0715.db/hive/test_partiton_date/ds=2020-07-18/logs (state=08S01,code=20531)
--插入語句
load data inpath '/tmp/logs' into table test_0715.test_partiton_date partition(ds='2020-07-19');
Unable to move source hdfs,不能移動,自然就想到了沒有權限的問題,果然,一查看發現/tmp/logs這個文件是hdfs的owner,所以hive用戶是沒有權限移動的。
現在我們需要做的就是,讓logs是hive用戶擁有。如下所示,切換訪問hdfs的用戶,把logs上傳到了hive權限的目錄下。
#linux切換訪問hdfs用戶為hive
export HADOOP_USER_NAME=hive
注意:1、其實不一定要logs的owner是hive,logs的父目錄的owner是hive也可以。
2、load完了之后,hdfs的logs文件就會被移動到分區目錄下。如上圖所示,上傳上去的文件被load后就沒有了。
可以看出,load命令其實就是mv文件而已,但是為什么還會選擇load呢,原因很簡單,其實在load的時候,不需要你手動創建分區,load命令直接幫你創建了。
--如果使用load,這一步是不需要的,使用hdfs的mv或者local的put到分區目錄,需要新建分區。
alter table test_partiton_date ADD PARTITION (ds='2020-07-19');