我正在尝试提取字符串的某些部分并将其存储在列中的hbase中。
文件内容:
msgType1 Person xyz has opened Internet:www.google.com from IP:192.123.123.123 for duration 00:15:00
msgType2 Person xyz denied for opening Internet:202.x.x.x from IP:192.123.123.123 reason:unautheticated
msgType1 Person xyz has opened Internet:202.x.x.x from IP:192.123.123.123 for duration 00:15:00
与msgType对应的消息模式是固定的。现在我想在hbase中存储人名,目的地,来源,持续时间等。
我正在尝试在PIG中使用脚本来执行此任务。 但是我被困在提取部分。(从字符串中的'Internet:202.x.x.x'标记中提取IP或网站名称)。
我试过正则表达式,但它不适合我。正则表达式总是抛出这个错误:
ERROR 1045: Could not infer the matching function for org.apache.pig.builtin.REGEX_EXTRACT as multiple or none of them fit. Please use an explicit cast.
有没有其他方法可以提取这些值并将其存储到PIG中的hbase或PIG以外的地方?
答案 0 :(得分:1)
我知道很容易变得懒惰而不采取措施,但你真的应该在这里使用user-defined function。 Pig作为一种数据流语言并不是很好,所以为了从中获取全部功能,你将需要使用大量的UDF来完成文本并执行更复杂的操作。
UDF将单个字符串作为参数,然后返回表示(person, destination, source, duration)
的元组。要使用它,你会做:
A = LOAD ...
...
B = FOREACH A GENERATE MyParseUDF(logline);
...
STORE B INTO ...
你没有提到你的HBase行键是什么,但在存储它之前确保它是关系中的第一个元素。
答案 1 :(得分:1)
如何使用REGEX_EXTRACT函数?你见过REGEX_EXTRACT_ALL函数了吗?根据文档(http://pig.apache.org/docs/r0.9.2/func.html#regex-extract-all),它应该是这样的:
test = LOAD 'test.csv' USING org.apache.pig.builtin.PigStorage(',') AS (key:chararray, value:chararray);
test = FOREACH test GENERATE FLATTEN(REGEX_EXTRACT_ALL (value, '(\\S+):(\\S+)')) as (match1:chararray, match2:chararray);
DUMP test;
我的文件是这样的:
1,a:b
2,c:d
3,