apachepig:提取以任意顺序出现的url查询参数

34gzjxbg  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(309)

我有一个带有URL的日志文件,这些URL用自定义的google analytics campaign参数(utm\u source、utm\u medium、utm\u campaign)标记。我需要从url中提取参数并创建一个csv文件,其中source、medium和campaign分别出现在它们自己的列中(加上日志文件中的其他几个字段)。
我就是这样开始的(url是包含url的字段):

extracted = foreach mydata GENERATE date, time, 
FLATTEN(REGEX_EXTRACT_ALL(url, '.*utm_source=(.*)&utm_medium=(.*)&utm_campaign=(.*)&.*?')) 
AS (source:CHARARRAY, medium:CHARARRAY, campaign:CHARARRAY);

这是可行的,但前提是参数以固定的顺序出现(并且不在url中的另一个参数的前面)。
因此,这将例如从https://www.example.com/page.html?&utm_source=publisher&utm_medium=display&utm_campaign=standard&someotherparam 但不是来自https://www.example.com/page.html?&utm_medium=display&utm_source=publisher&utm_campaign=standard&someotherparam. 因为参数顺序不一致,所以这对我不起作用。
我尝试了多个regexp条件,用or(|)分隔,但这只给了我第一个匹配。我还尝试在它自己的extract命令中提取每个参数,然后加入数据,但这花费了很长时间,最终复制了数据。
那么,重写pig命令的最佳方法(或者至少是可行的)是什么呢?这样它就可以从url中提取所有三个utm参数,而不受它们出现的顺序的影响?

hivapdat

hivapdat1#

我只要三个 REGEX_ECTRACT :

... FOREACH mydata GENERATE FLATTEN(REGEX_EXTRACT(url, '.*utm_source=([^&]*)'), 1) AS (source:CHARARRAY)
...

虽然你可能只用一个正则表达式就可以做到,但我发现这个更简单,更易读。

相关问题