用猪分裂字符串

时间:2014-03-11 22:14:57

标签: hadoop apache-pig

我有一个以下格式的字符串:

周六,2011年7月9日05:38:24 GMT

我会得到这样的输出:

2011年7月9日 5点38分24秒

感谢。

[编辑] 我尝试了很多解决方案,但我遇到了错误。我会重新解释这个问题。我有一个XML文件,我有一个节点:Tue,05 Jul 2011 10:10:30 GMT,我想从中提取两个分离的字符串,如上图所示。 我试过这段代码:

register /usr/lib/pig/piggybank.jar; 
items = LOAD ' depeche/2011_7_10_12_30_rss.txt' USING org.apache.pig.piggybank.storage.XMLLoader('item') AS  (item:chararray); 
source_name = FOREACH items GENERATE REGEX_EXTRACT(item, '<link>(.*)</link>', 1) AS  link:chararray, 
REGEX_EXTRACT(item, '<title>(.*)</title>', 1) AS  title:chararray, 
REGEX_EXTRACT(item, '<description>(.*)</description>',  1) AS description:chararray, 
REGEX_EXTRACT(item, '<pubDate>(.*)</pubDate>', 1) AS  pubdate:chararray, 
sortie = FOREACH pubdate GENERATE SUBSTRING((chararray)$0, 4, 25);
illustrate sortie;

错误:

[main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 21, column 333>         mismatched input '=' expecting SEMI_COLON

1 个答案:

答案 0 :(得分:2)

编辑答案:

这个例子有点清楚......我抓住了一个RSS提要示例,并进行了快速测试。下面的代码使用了一个示例,其中包含上例中的所有元素。然而,我使用REGEX_EXTRACT而不是SUBSTRING来获取pubdate。

- rss.pig

REGISTER piggybank.jar

items = LOAD 'rss.txt' USING org.apache.pig.piggybank.storage.XMLLoader('item') AS  (item:chararray);

data = FOREACH items GENERATE REGEX_EXTRACT(item, '<link>(.*)</link>', 1) AS  link:chararray, 
REGEX_EXTRACT(item, '<title>(.*)</title>', 1) AS  title:chararray,
REGEX_EXTRACT(item, '<description>(.*)</description>',  1) AS description:chararray,
REGEX_EXTRACT(item, '<pubDate>.*(\\d{2}\\s[a-zA-Z]{3}\\s\\d{4}\\s\\d{2}:\\d{2}:\\d{2}).*</pubDate>', 1) AS  pubdate:chararray;

dump data;

- rss.txt

<rss version="2.0">
   <channel>
      <title>News</title>
      <link>http://www.hannonhill.com</link>
      <description>Hannon Hill News</description>
      <language>en-us</language>
      <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
      <generator>Cascade Server</generator>
      <webMaster>webmaster@hannonhill.com</webMaster>
      <item>
         <title>News Item 1</title>
         <link>http://www.hannonhill.com/news/item1.html</link>
         <description>Description of news item 1 here.</description>
         <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>
         <guid>http://www.hannonhill.com/news/item1.html</guid>
      </item>
      <item>
         <title>News Item 2</title>
         <link>http://www.hannonhill.com/news/item2.html</link>
         <description>Description of news item 2 here.</description>
         <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>
         <guid>http://www.hannonhill.com/news/item2.html</guid>
      </item>
      <item>
         <title>News Item 3</title>
         <link>http://www.hannonhill.com/news/item3.html</link>
         <description>Description of news item 3 here.</description>
         <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
         <guid>http://www.hannonhill.com/news/item3.html</guid>
      </item>
   </channel>
</rss>

rss.pig的结果:

(http://www.hannonhill.com/news/item1.html,News Item 1,Description of news item 1 here.,03 Jun 2003 09:39:21)
(http://www.hannonhill.com/news/item2.html,News Item 2,Description of news item 2 here.,30 May 2003 11:06:42)
(http://www.hannonhill.com/news/item3.html,News Item 3,Description of news item 3 here.,20 May 2003 08:56:02)




原始答案:

这里有几种方法可行,所以我将介绍两种: SUBSTRING REGEX_EXTRACT

如果你的字符串长度是常数,那么你可以使用内置的SUBSTRING函数。可以把它想象成Linux中的cut命令。

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 4, 25);

否则,您可以使用内置REGEX_EXTRACT来提取您正在寻找的字符串。举个例子,我想出的最简单的正则表达式匹配是用第一个数字开始字符串,以最后一个数字结束,捕获其间的所有字符。

OUTPUT = FOREACH INPUT GENERATE REGEX_EXTRACT((chararray)$0, '([\d].*[\d])', 1);