gpt4 book ai didi

regex - Pig - 使用正则表达式提取字符串

转载 作者:行者123 更新时间:2023-12-01 11:42:29 24 4
gpt4 key购买 nike

我正在使用 pig 分析日志文件。

我的输入日志文件('/user/586376/Pig_C')看起来像这样。

12901890 \t rosies blog \t 2006-05-15 21:42:19 \t 1 \t http://www.rosie.com


A = load '/user/586376/Pig_C' as (ID:int, query:chararray, time:chararray, rank:int, url:chararray);

在这里,我想列出一天中以下时间经常访问的站点( 前 3 ): 上午 10 点到上午 11 点

目前,我在时间字段上使用 STRSPLIT 来提取所需的小时数。
Timesplit = FOREACH A GENERATE url, STRSPLIT(time,' ') as time_split;

B = FOREACH Timesplit GENERATE url, FLATTEN(time_split) as (date,time1);

C = FOREACH B GENERATE url, STRSPLIT(time1,':') as h;

final = FOREACH C GENERATE url,flatten(h) AS (hour,min,sec);

拆分时间字段后,我使用 过滤器 , GROUP BY 计数 UDF 查找上午 10 点期间经常访问的前 3 个 url。和上午 11 点

输出:
(http://www.google.com,5)

(http://finance.yahoo.com,2)

(http://www.nada.com,2)

但是,我觉得必须有一种更简单的方法来使用 PIG UDF 作为 获取小时字段。 regex_extract regex_extract_all 而不是使用STRSPLIT。但是我无法编写正则表达式来从给定的时间戳中提取所需的小时数。

现在有什么想法可以编写正则表达式来查找给定时间戳的小时数吗?

编辑:

在 pig 中编写以下正则表达式以提取小时数:
data = FOREACH A GENERATE url, FLATTEN(EXTRACT(time,'\\d{4}-\\d{2}-\\d{2}\\s(\\d{2}):\\d{2}:\\d{2}')) AS (hour:chararray) ;

但得到以下错误,

错误:

2013-08-19 18:20:28,745 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1045: Could not infer the matching function for org.apache.pig.piggybank.evaluation.string.RegexExtract as multiple or none of them fit. Please use an explicit cast.



任何建议,我哪里出错了???

最佳答案

从评论来看,您似乎混淆了 REGEX_EXTRACT 的论点。和 REGEX_EXTRACT_ALL .由于您只需要提取一部分,请使用 REGEX_EXTRACT ,它不返回元组,但需要另一个指定索引的参数:

data =
FOREACH A
GENERATE
url,
REGEX_EXTRACT(time, '\\d{4}-\\d{2}-\\d{2}\\s(\\d{2}):\\d{2}:\\d{2}', 1)) AS(hour:chararray);

可能是 REGEX_EXTRACT 的第三个参数应该是 0 而不是 1,我不记得了。两个都试试。

关于regex - Pig - 使用正则表达式提取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18312090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com