2014-07-21 37 views
1

我將分隔符的數據定義爲「,|」。使用RegexSerDe在Hive中創建DDL的錯誤

我所創建的蜂巢DDL如下:

 CREATE TABLE player_profile 
     (
     player_id BIGINT COMMENT 'Player Profile Identifier', 
     change_ts STRING COMMENT 'Change Datetime', 
     child_birth_year INT COMMENT 'Child Birth Year', 
     country STRING COMMENT 'Country Code', 
    ) 
     ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
     WITH SERDEPROPERTIES ('input.regex'='^(\\d+),\\|(.*),\\|(\\d+),\\|(.*)$') 
     STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
     OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 

我正在流動的錯誤,同時部署這DDL。

FAILED: Error in metadata: java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeException org.apache.hadoop.hive.contrib.serde2.RegexSerDe only accepts string columns, but column[0] named player_id has type bigint) 
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask 

這是我給出的正則表達式的問題嗎?如果是這樣的話,這個正則表達式是什麼。

Hive(0.11)正則表達式serde是否支持BIGINT?

回答

2

RegexSerDe明確檢查所有列是否爲字符串。請參閱RegexSerDe.java

您可以將所有列更改爲字符串,然後在查詢數據時將其轉換爲int和string。

0

正如你的異常說明問題:

RegexSerDe only accepts string columns, but column[0] named player_id has type bigint 

RegexSerDe不支持BIGINT唯一字符串。

你有沒有試圖改變:

player_id BIGINT COMMENT 

通過:

player_id STRING COMMENT 

要檢查它是否解決了您的問題?

你可以看到RegexSerDe.java源代碼提到它:

// All columns have to be of type STRING. 
for (int c = 0; c < numColumns; c++) { 
    if (!columnTypes.get(c).equals(TypeInfoFactory.stringTypeInfo)) { 
    throw new SerDeException(getClass().getName() 
     + " only accepts string columns, but column[" + c + "] named " 
     + columnNames.get(c) + " has type " + columnTypes.get(c)); 
    } 
} 

正如你所看到的就是你所得到的錯誤。希望能提供幫助。