0

我正在使用 Pig 来处理数据。

我的数据看起来像:

<?xml version="1.0" encoding="UTF-8"?><MC><SC><S uid="1" gen="" art="Samsung" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Vacation"/><S uid="2" gen="" art="Samsung" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Mother earth"/><S uid="3" gen="" art="Samsung" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Over the horizon"/><S uid="4" gen="" art="Samsung" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Vocalise"/><S uid="5" gen="" art="Kitschi cupid" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung BeatDJ" ttl="Hard beat floor"/><S uid="6" gen="" yr="2011" art="David Kater" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Nothing left to say"/><S uid="7" gen="" art="Samsung" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Morning Dew"/><S uid="12" gen="" art="&lt;unknown&gt;" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/download" alb="download" ttl="mirzaghalib6_www.songs.pk_"/><S uid="13" gen="" art="&lt;unknown&gt;" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/download" alb="download" ttl="mirzaghalib7_www.songs.pk_"/><S uid="4555" gen="" yr="2012" art="Javed Ali &amp; Shakthisree Gopalan" cmp="Music: A.R. Rahman | Lyrics: Gulzar" fld="/mnt/sdcard/WhatsApp/Media/WhatsApp Audio" alb="Jab Tak Hai Jaan" ttl="Jab Tak Hai Jaan - www.Songs.PK"/></SC><PC/></MC>)

我的目标是解析它并将 art=" " 中的条目相互依赖地保存在 HDFS 中。

我使用了以下 PIG 命令:

A= load 'smalltestdata' USING TextLoader() AS (line:chararray);
data_split=FILTER C BY (line matches '.*art=.*');

我错过了什么吗?

4

1 回答 1

1

要仅在使用以下正则表达式之后art="和之前获取信息:"

(?<=art\=")(.*?)(?=")

这是正在发生的事情:

1. (?<=art\=") - This is a lookbehind.  It will look for matches after `art="`
2. (.*?)       - This is the search string that is returned.  The `?` makes it non-greedy, so it only grabs the least number of finds
3. (?=")       - This is a lookahead.  It will search for things before `"`

不返回 Lookbehinds 和 lookaheads,因此结果将是 和 之间的所有art="文本"

于 2013-03-11T17:49:08.250 回答