在 hadoop 中的 Pig 中使用正则表达式

Posted

技术标签:

【中文标题】在 hadoop 中的 Pig 中使用正则表达式【英文标题】:Using Regex in Pig in hadoop 【发布时间】:2015-08-19 07:51:47 【问题描述】:

我有一个包含用户(tweetid、tweets、userid)的 CSV 文件。

396124436476092416,"Think about the life you livin but don't think so hard it hurts Life is truly a gift, but at the same it is a curse",Obey_Jony09
396124436740317184,"“@BleacherReport: Halloween has given us this amazing Derrick Rose photo (via @amandakaschube, @ScottStrazzante) http://t.co/tM0wEugZR1” yes",Colten_stamkos
396124436845178880,"When's 12.4k gonna roll around",Matty_T_03

现在我需要编写一个 Pig 查询,它返回所有包含单词 'favorite' 的推文,按推文 ID 排序。

为此,我有以下代码: A = load '/user/pig/tweets' as (line); B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*)[,”:-](.*)[“,:-](.*)')) AS (tweetid:long,msg:chararray,userid:chararray); C = filter B by msg matches '.*favorite.*'; D = order C by tweetid;

正则表达式如何在此处以所需的方式拆分输出?

我尝试使用 REGEX_EXTRACT 而不是 REGEX_EXTRACT_ALL,因为我发现这更简单,但除了提取推文外无法使代码正常工作:

B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT(line,'[,”:-](.*)[“,:-]',1)) AS (msg:chararray);

上面的别名为我提供了推文,但如果我使用 REGEX_EXTRACT 来获取推文 ID,我不会得到所需的 o/p:B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT(line,'(.*)[,”:-]',1)) AS (tweetid:long);

(396124554353197056,"Just saw @samantha0wen and @DakotaFears at the drake concert #waddup")
(396124554172432384,"@Yutika_Diwadkar I'm just so bright ????")

(396124554609033216,"@TB23GMODE i don't know, i'm just saying, why you in GA though? that's where you from?")

(396124554805776385,"@MichaelThe_Lion me too ????")

(396124552540852226,"Happy Halloween from us 2 @maddow & @Rev_AlSharpton :) http://t.co/uC35lDFQYn")
grunt> 

请帮忙。

【问题讨论】:

【参考方案1】:

无法发表评论,但通过查看和测试,您在正则表达式中的引号与 csv 中的引号不同。

" 在 csv 中

在正则表达式代码中。

要获得tweetid,试试这个:

B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT(line,'.*(,")',1))  AS (tweetid:long);

【讨论】:

以上是关于在 hadoop 中的 Pig 中使用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 pig 中使用正则表达式解析日志文件

pig - 用正则表达式解析字符串

使用 Piggybank 使用 Pig 进行 XML 解析

如何在 Hadoop 中的机器之间传输文件并使用 Pig 搜索字符串

Hadoop相关项目Hive-Pig-Spark-Storm-HBase-Sqoop

如何从 Apache Pig 中的文件中读取多个文件?