PIG-Hadoop - 在 PIG 中有一种方法可以使用 Regex 进行内部连接

PIG-Hadoop - In PIG is there a way to Inner-Join with Reg-Ex

我有 2 个文件(消息、密钥)。我想从 'messages' 中取出所有包含来自 'keys'.

的单词的行
messages = LOAD 'my-messages.txt' as (message:chararray);
keys = LOAD 'keys.txt' as (key: chararray);

现在我知道我可以在消息和密钥之间进行内部连接,但这在以下情况下不起作用:

message = "hi there"
key = "hi"

我正在考虑使用 UDF 来绕过它:

DEFINE containsKey my.udf.Matches("path/keys.txt");
matches = FILTER messages BY containsKey(messages);

然后在 UDF 循环中遍历所有键(哎呀!)感觉不对...不确定我的方法是否正确,请随时提供建议。

这看起来像是可以使用 CROSS 的用例。参考:http://pig.apache.org/docs/r0.7.0/piglatin_ref2.html#CROSS

这可能不是最佳解决方案,分享一个可行的方法。

输入:

留言:

hi there
He said "Hi, how are you doing ?"
HI there
Hello there

键:

hi

猪脚本:

messages = LOAD 'messages.csv' USING PigStorage('\t') AS (message:chararray);
keys = LOAD 'keys.csv' USING PigStorage('\t') AS (key:chararray);

crossed_data = CROSS messages, keys ;

filt_required_data = FILTER crossed_data BY LOWER(messages::message) MATCHES CONCAT('.*', LOWER(keys::key), '.*');

required_data =  FOREACH filt_required_data GENERATE messages::message AS message;

DUMP required_data;

输出:

(hi there)
(He said "Hi, how are you doing ?")
(HI there)