将一些字段从PIG存储到Hbase

时间:2012-03-27 11:37:52

标签: hadoop apache-pig

我正在尝试提取字符串的某些部分并将其存储在列中的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以外的地方?

2 个答案:

答案 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,