【问题标题】:Hive RegexSerDeHive RegexSerDe
【发布时间】:2016-05-11 17:37:05
【问题描述】:

我需要从平面文件中读取数据。它包含许多行,但想从如下行中提取数据:

REVISION 12 30364918 Anarchism 2005-12-06T17:44:47Z RJII 141644

我只想要这一行的第 2、3、5 个条目并将它们放入 Hive 表中;我已发出此命令,但出现错误

create external table testTable (
tag string, 
a string, 
r string
) 
row format SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES(
"input.regex" = "REVISION\s,[0-9]*,\s,[0-9]*,\s[a-zA-Z0-9]*\s,[0-9]*-[0-9]*-[0-9]*T[0-9]*:[0-9]*:[0-9]*Z",
"output.format.string" = "%1$s %2$s %3$s") 
stored as textfile 
location 'hdfs://location:8020/user/bd4-project1/enwiki-20080103-sample';

它似乎不起作用并不断给出异常。有任何想法吗? 正则表达式可能是错误的,但我只是不知道

我可以稍后发布异常,目前无法访问集群

【问题讨论】:

  • 通常使用双引号会涉及一些字符串转义。你试过"REVISION\\s,[0-9],\\s,[0-9],\\s[a-zA-Z0-9]\\s,[0-9]-[0-9]*-[0-9]T[0-9]:[0-9]*:[0-9]*Z",还是只是逃避?
  • \s 是我们想要使用的空间

标签: regex hadoop hive hiveql


【解决方案1】:

我已经使用 Hive 0.10.0 对此进行了测试,它应该适合你。

create table ts_test2(
  tag string, 
  a string, 
  r string
) 
row format SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES(
"input.regex" = "REVISION ([0-9]+) ([0-9]+) [a-zA-Z0-9]+ ([0-9]+-[0-9]+-[0-9]+T[0-9]+:[0-9]+:[0-9]+[Z]) RJII [0-9]+$",
"output.format.string" = "%1$s %2$s %3$s");  

一些注意事项:
1. 确保您的正则表达式 完全 正确地计算所有行,否则您将在 hive 表中获得 NULL至少this之类的地方测试正则表达式
2.使用()包裹你感兴趣的字段。
3.我用的是空间,你可以改成\s(或者\\s)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2012-06-16
    相关资源
    最近更新 更多