pig hadoop-in pig有没有一种内部连接reg ex的方法

myzjeezk  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(329)

我有2个文件(消息,密钥)。我想把所有的“消息”都从“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);

然后在自定义项中循环所有键(yikes!)感觉不对…不确定我的方法是否正确,所以请随时提供建议。

lqfhib0f

lqfhib0f1#

这看起来像是一个可以使用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)

相关问题