Apache Hive正则表达式返回所有NULL值

时间:2014-01-24 15:40:47

标签: regex apache hive

我正在使用带有正则表达式serde的apache Hive 0.11但是当我从表限制5中执行select(*)时,每个列都应该有值为NULL的值。

我的创建脚本:

CREATE EXTERNAL TABLE log_corelio (timestamp STRING, ad STRING, cookieID STRING, slot STRING, language STRING, randomNumber STRING, age STRING, gender STRING, city STRING, date STRING, interests STRING, brands STRING, country STRING, region STRING, pageview_count STRING, member_status STRING, isp STRING, screen_width STRING, hashkey STRING, id STRING, ag STRING, ge STRING, l1 STRING, l2 STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "^\[([^\]]*)\]\|\/pool\/([^|]*)\|([^\|]*)\|GET \/ad\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)","output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s %11$s %12$s %13$s %14$s %15$s %16$s %17$s %18$s %19$s %20$s %21$s %22$s %23$s %24$s")
LOCATION '/user/adhese/corelio/corelio6';

仅限正则表达式:

^\[([^\]]*)\]\|\/pool\/([^|]*)\|([^\|]*)\|GET \/ad\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)\/([^\/]*)

我真的没有看到什么是错的,我希望我需要在我的正则表达式中逃避一些事情,但我不知道是什么。

正则表达式应匹配:

[21/May/2013:23:59:59 +0100]|/pool/256955.log|62.235.161.115.1369169828196156|GET /ad/32869/nl/147/_age_/_gender_/_city_/_date_/;adttr12842;adttrlifestyle;adttrwielrennen;gmbl;prx/Explorer;Explorer9;Scarlet;Windows7;screen3/BE/01/21/undefined/Scarlet/_screenWidth_/_hashKey_/_ID_/_AG_/_GE_/_l1_/_l2_/|200|2|987||||

干杯。

2 个答案:

答案 0 :(得分:2)

darkownage:“我测试了你的正则表达式 - 日志记录无法与正则表达式匹配”。记录应该完全匹配与正则表达式然后只有RegexserDe工作。完全注意

测试工具:regex rubular - 请检查正则表达式的最后部分&记录最后一行有一些空管(这部分是无与伦比的 - / | 200 | 2 | 987 ||||)

原因为NULL:

请参阅RegexSerDe文档说明。

要点:

  • 在反序列化阶段,if a row does not match the regex, then all columns in the row will be NULL。如果一行与正则表达式匹配但具有少于预期的组,则缺少的组将为NULL。如果一行与正则表达式匹配但具有多于预期的组,则会忽略其他组

答案 1 :(得分:0)

您应该使用\\进行测试,而不是仅使用1 \进行测试。我发现\w与我的正则表达式不匹配,但是当我写\\w时它完美无缺。