Regex SerDe не поддерживает ошибку метода serialize () - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть структура таблицы, как показано ниже.

CREATE TABLE db.TEST(
f1 string,
f2 string,
f3 string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'input.regex'='(.{2})(.{3})(.{4})' )
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://nameservice1/location/TEST';

Я попытался вставить запись в таблицу, как показано ниже.

insert overwrite table db.TEST2 
select '12' as a , '123' as b , '1234' as c ;

При попытке вставить данные в таблицу,сталкивается с ошибкой ниже.

Причина: java.lang.UnsupportedOperationException: Regex SerDe не поддерживает метод serialize () в org.apache.hadoop.hive.serde2.RegexSerDe.serialize (RegexSerDe.java: 289)

Есть идеи, что не так?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы используете неправильный класс SerDe. org.apache.hadoop.hive.serde2.RegexSerDe не поддерживает сериализацию.Посмотрите на исходный код - serialize метод ничего не делает, но выдает UnsupportedOperationException исключение:

 public Writable serialize(Object obj, ObjectInspector objInspector)
      throws SerDeException {
        throw new UnsupportedOperationException(
          "Regex SerDe doesn't support the serialize() method");
}

И решение

для использования другого класса SerDe: org.apache.hadoop.hive.contrib.serde2.RegexSerDe , он может сериализовать объект строки в формате строкаФормат сериализации должен быть указан в SERDEPROPERTIES.Посмотрите исходный код для получения более подробной информации.

Пример свойств SerDe:

WITH SERDEPROPERTIES ( 'input.regex' = '(.{2})(.{3})(.{4})','output.format.string' = '%1$2s%2$3s%3$4s') 

Для вашей таблицы это будет выглядеть так:

CREATE TABLE db.TEST(
f1 string,
f2 string,
f3 string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'input.regex'='(.{2})(.{3})(.{4})',
  'output.format.string' = '%1$2s%2$3s%3$4s' )
LOCATION
  'hdfs://nameservice1/location/TEST';
...