簡體   English   中英

Hive:創建表和分區依據

[英]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中的數據會被粘住。

你有幾個選擇:

  1. 如果導入成本很高且數據尚未分區。 保留該表,但創建一個新表,即xyzlogTable_partitioned,它將是此表的分區版本。 您可以在Hive中使用動態分區來填充此新表。

  2. 如果進口成本很高但數據已經分區; 例如,假設您已經在HDFS中的每個分區的單獨文件中有數據。 創建一個新的分區表並有一個bash腳本(或等效的),從與未分區表對應的HDFS目錄移動(或復制,以后刪除,如果你保守的話)到對應於新分區的相應分區的目錄表。

  3. 如果導入便宜:刪除整個表。 重新創建新的分區表並重新導入。 很多時候,如果導入過程不知道分區模式(換句話說,如果導入不能直接將數據推送到適當的分區),那么擁有一個未分區的表(就像你已經擁有的那樣)是一個常見的用例。作為登台表,然后使用Hive查詢或動態分區來填充新的分區表,該表將在工作流的后續查詢中使用。

您應首先刪除已創建的表,然后創建分區表。 或者更改您的表名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM