hive:按和serdeproperty分区

4uqofj5v  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(269)

我正在尝试创建一个配置单元表,其中分区由一个字段组成。我想处理的数据是日志数据。日志格式为:
日期时间IP地址http\方法消息
创建表配置单元查询:

CREATE EXTERNAL TABLE test_Part(
logdate string,
logtime string,
ip string,
message string)
PARTITIONED BY(method string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(\\d{4}-\\d{2}-\\d{2})\\s(\\d{2}:\\d{2}:\\d{2})\\s(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s(\\S+)\\s(.*$)",
"output.format.string" = "%1$s %2$s %3$s %5$s %4$s"
)
STORED AS TEXTFILE;

并加载脚本:

LOAD DATA LOCAL INPATH '/home/user/tools/apache-hive-1.2.2-bin/scripts/sample1.log' OVERWRITE INTO TABLE test_Part PARTITION(method='GET');

当我在上面的表上运行select查询时,它会给我错误消息
失败,出现异常java.io.ioexception:org.apache.hadoop.hive.serde2.serdeexception:匹配组的数目与列的数目不匹配
我错过了什么?

t0ybt7op

t0ybt7op1#

应该是4个组,因为表ddl中有4列。在正则表达式中有5个组。 method 是一个分区(包含文件的目录),此列通常不存在于文件本身中,您不需要在regex中指定它。
分区存储为包含分区位置和键值的元数据。位置类似于表\u dir/method=get/
这里有一个很好的例子:http://www.dowdandassociates.com/blog/content/howto-use-hive-with-apache-logs/
如果文件中还存在分区列,则应向表定义中添加更多列。好像有一列。它是http\u方法吗?然后只需在message列之前再添加一个列http\u方法,并再次检查regexp。

xxls0lw8

xxls0lw82#

分区反映了这样一种情况:以特定值(分区列值)为特征的行可以直接访问,而不需要访问其他不必要的数据。
这里显然不是这样,所以不能在数据文件上声明分区表。
从这一点上,您可以执行以下操作:

1.

把隔板去掉。

CREATE EXTERNAL TABLE test_Part_stg(
logdate string,
logtime string,
ip string,
method string,
message string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(\\d{4}-\\d{2}-\\d{2})\\s(\\d{2}:\\d{2}:\\d{2})\\s(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s(\\S+)\\s(.*$)"
)
STORED AS TEXTFILE;

2. ((可选)

创建一个额外的分区表,并使用上一步中的表填充它。
(此表存储不必是textfile)

CREATE EXTERNAL TABLE test_Part(
logdate string,
logtime string,
ip string,
message string)
PARTITIONED BY(method string)
STORED AS TEXTFILE;
set hive.exec.dynamic.partition.mode=nonstrict
;
insert into test_Part partition (method)
select logdate,logtime,ip,message,method 
from   test_Part_stg
;

insert into test_Part partition (method) (logdate,logtime,ip,method,message)
select * 
from   test_Part_stg
;

p、 s。 output.format.string 已弃用,它未在regexserde中定义,并且与任何其他未定义的serde参数一样没有函数意义。

相关问题