【问题标题】:Hive: PARTITIONED BY and SERDEPROPERTIESHive:由和 SERDEPROPERTIES 分区
【发布时间】:2017-12-07 01:33:35
【问题描述】:

我正在尝试创建一个按单个字段分区的配置单元表。我要处理的数据是日志数据。日志格式为:

日期时间 IP 地址 HTTP_METHOD 消息

创建表配置单元查询:

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

当我对上表运行选择查询时,它给我的错误消息为

异常失败 java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: 匹配组数与列数不匹配

我错过了什么?

【问题讨论】:

  • 您的数据是否被method分隔到不同的文件中?
  • 没有。所有数据都在一个文件中。

标签: regex hive hiveql partition hive-serde


【解决方案1】:

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

从此时起,您可以执行以下操作:

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
;

附言

output.format.string 已弃用,它未在 RegexSerDe 中定义,并且与任何其他未定义的 SerDe 参数一样没有功能意义。

【讨论】:

    【解决方案2】:

    应该是 4 个组,因为表 DDL 中有 4 列。在您的正则表达式中有 5 个组。 method是一个分区(有文件的目录),这个列在文件本身中通常是不存在的,你不需要在正则表达式中指定。

    分区存储为包含分区位置和键值的元数据。 位置看起来像 table_dir/method=GET/

    在此处查看很好的示例: http://www.dowdandassociates.com/blog/content/howto-use-hive-with-apache-logs/

    如果文件中还存在分区列,则应在表定义中添加更多列。似乎列存在。是 HTTP_METHOD 吗?然后只需在消息列之前再添加一列 HTTP_METHOD 并再次检查您的正则表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2016-04-01
      • 2017-04-15
      • 1970-01-01
      相关资源
      最近更新 更多