在Hive中使用RegexSerDe创建DDL错误



我有分隔符为",|"的数据。

我已经创建了hive 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) regex服务器是否支持BIGINT ?

RegexSerDe显式检查是否所有列都是字符串。看到RegexSerDe.java

您可以将所有列更改为字符串,然后在查询数据时在int和string之间进行强制转换。

如您的异常中所述的问题:

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));
  }
}

正如你所看到的,这就是你得到的错误。希望对您有所帮助。

最新更新