我试图解析以下行,例如使用Hive中的RegexeSerde:
2011-07-22 20:34:51 808 8b1f27d094fb33ea - - - OBSERVED"不可用" http://www.4shared.com/ 200 TCP_NC_MISS GET text / javascript; charset = UTF-8 http dc413.4shared.com 80 /network/search-suggest.jsp?search = 2 KfZhNit2LHYqA ==& format = jsonp jsp " Mozilla / 5.0(Windows; U; Windows NT 6.1; en-US; rv:1.9.2.18) Gecko / 20110614 Firefox / 3.6.18" 82.137.200.42 484 852 -
我的表定义如下:
CREATE external TABLE browsing_data_ext(
cdate STRING,
ctime STRING,
time_taken STRING,
c_ip STRING,
cs_username STRING,
cs_auth_group STRING,
x_exception_id STRING,
sc_filter_result STRING,
cs_categories STRING,
cs_Referer STRING,
sc_status STRING,
s_action STRING,
cs_method STRING,
rs_Content_Type STRING,
cs_uri_scheme STRING,
cs_host STRING,
cs_uri_port STRING,
cs_uri_path STRING,
cs_uri_query STRING,
cs_uri_extension STRING,
cs_User_Agent STRING,
s_ip STRING,
sc_bytes STRING,
cs_bytes STRING,
x_virus_id STRING )
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([\\-0-9]*) ([\\:0-9]*) ([\\d]*) ([\\.a-z0-9]*) ([\\-a-z0-9]*) ([\\-a-z0-9]*) ([\\-a-z0-9]*) ([\\w]*) (\\\"[\\w]*\\\") ([\\.\\-\\=\\&:\\/\\?a-z0-9]*) ([\\d]*) ([\\_\\w]*) ([\\w]*) ([\\/\\w]*) ([\\w]*) ([\\.\\w]*) ([\\d]*) ([\\.\\-\\=\\&:\\/\\?a-z0-9]*) ([\\.\\-\\=\\&:\\/\\?a-z0-9]*) ([\\.\\w]*) (\\\"[\\w\\W]*\\\") ([.:a-z0-9]*) ([\\d]*) ([\\d]*) ([\\-a-z0-9]*)",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s %10$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 %25$s"
)
STORED AS TEXTFILE
LOCATION '/user/hdfs/Data'
tblproperties ("skip.header.line.count"="6");
我已经用rubular和其他一些Regex验证工具对它进行了测试,但是当我从表中选择时我只接收到NULL值;
谢谢, 丹尼尔
答案 0 :(得分:0)
我必须阅读一个很长的日志文件,解决它的过程是:
用这个创建正则表达式 1)https://regex101.com/#java
2)仅替换“\ w”“\ s”和“\ w”代替“\ w”
在每个括号内,我使用“+”而不是“*”来表示“一个或多个”。
没有2)结果是整行具有NULL值但是在向所有特殊字符添加双“\”之后,测试被成功解析。