用pig拆分字符串

5uzkadbs  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(391)

我有一个字符串,格式如下:
星期六,2011年7月9日05:38:24 gmt
我会有这样的输出:
2011年7月9日05: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
egmofgnx

egmofgnx1#

编辑答案:

这个例子更清楚一点。。。我抓起一个rss提要示例,做了一个快速测试。下面的代码使用了一个包含上面示例中所有元素的示例。不过,我使用regex\u 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\u extract。
如果字符串长度是常量,则可以使用内置子字符串函数。把它想象成 cut 命令。 OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 4, 25); 否则,您可以使用内置的regex\u extract来提取您要查找的字符串。在这个例子中,我想到的最简单的正则表达式匹配是从字符串的第一个数字开始,最后一个数字结束,捕获中间的所有字符。 OUTPUT = FOREACH INPUT GENERATE REGEX_EXTRACT((chararray)$0, '([\d].*[\d])', 1);

相关问题