[英]Hive: Create Table and Partition By
我有一個加載數據的表如下:
create table xyzlogTable (dateC string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' with serdeproperties( "input.regex" = "(\\S+)\\t(\\d+):(\\d+):(\\d+)\\t(\\S+)\\t(\\S+)\\t(\\S+)\\t(\\S+)", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s") stored as textfile;
load data local inpath '/home/hadoop/hive/xyxlogData/' into table xyxlogTable;
總行數超過300萬。 一些查詢工作正常,一些查詢進入無限循環。
看到那個選擇后,通過查詢分組需要很長時間,有時甚至不返回結果,決定去分區。
但以下兩個陳述都失敗了:
create table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string);
失敗:元數據中的錯誤:AlreadyExistsException(消息:表xyzlogTable已存在)失敗:執行錯誤,從org.apache.hadoop.hive.ql.exec.DDLTask返回代碼1
Alter table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string);
FAILED:Parse Error:第1行第12行無法識別alter table語句中的輸入'xyzlogTable'
任何想法都是這個問題!
這正是我更喜歡在Hive中使用外部表的原因。 您創建的表不是外部的(您使用create table
而不是create external table
)。 使用非外部表,刪除表,刪除HDFS中的元數據(名稱,列名,類型等)和表的數據。 相反,當刪除外部表時,僅刪除元數據,HDFS中的數據會被粘住。
你有幾個選擇:
如果導入成本很高且數據尚未分區。 保留該表,但創建一個新表,即xyzlogTable_partitioned,它將是此表的分區版本。 您可以在Hive中使用動態分區來填充此新表。
如果進口成本很高但數據已經分區; 例如,假設您已經在HDFS中的每個分區的單獨文件中有數據。 創建一個新的分區表並有一個bash腳本(或等效的),從與未分區表對應的HDFS目錄移動(或復制,以后刪除,如果你保守的話)到對應於新分區的相應分區的目錄表。
如果導入便宜:刪除整個表。 重新創建新的分區表並重新導入。 很多時候,如果導入過程不知道分區模式(換句話說,如果導入不能直接將數據推送到適當的分區),那么擁有一個未分區的表(就像你已經擁有的那樣)是一個常見的用例。作為登台表,然后使用Hive查詢或動態分區來填充新的分區表,該表將在工作流的后續查詢中使用。
您應首先刪除已創建的表,然后創建分區表。 或者更改您的表名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.