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

标签 hadoop apache-pig

我有 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/

相关文章:

hadoop - 无法执行大于 10Kb 的数据

apache-pig - 使用 HBaseStorage 通过 Dataproc 上的 Pig 从 Bigtable 加载

hadoop - 添加额外的列到一个已经存在的列

python - pyspark对角比较两列

hadoop - 你可以用 hadoop-mapreduce-examples-2.2.0.jar 做什么?

java - 用于捕获工作统计信息的任何好的 java 库?

hadoop - Pig 可以处理 ebcdic 格式文件吗?

hadoop - Pig 将如何处理倾斜连接?

hadoop - 设置协调器oozie文件不存在报错如何解决

hadoop - 关于 Apache sqoop 的 Avrodata 文件和序列文件之间的区别