1

我有一个如下表结构。

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 不支持 org.apache.hadoop.hive.serde2.RegexSerDe.serialize(RegexSerDe.java:289) 处的 serialize() 方法

知道出了什么问题吗?

4

1 回答 1

2

您使用了错误的 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';
于 2018-12-12T15:00:23.813 回答