我有 2 个文件(消息、 key )。我想从“消息”中提取所有包含“键”中的单词的行。
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
pig 脚本:
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)
关于hadoop - PIG-Hadoop - 在 PIG 中有一种方法可以使用 Regex 进行内部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770864/