regex serde不支持serialize()方法错误

vx6bjr1n  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(605)

我的表格结构如下。

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)中的serialize()方法。java:289)
你知道怎么回事吗?

wlzqhblo

wlzqhblo1#

你用错了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,它可以使用格式字符串序列化row对象。应在中指定序列化格式 SERDEPROPERTIES . 查看源代码了解更多详细信息。
serde属性示例:

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

你的table是这样的:

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';

相关问题