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

Apache Pig: Extracting url query parameters that appear in arbitrary order

我有一个包含 url 的日志文件,这些日志文件标记有自定义 Google 分析活动参数(utm_source、utm_medium、utm_campaign)。我需要从 urls 中提取参数并创建一个 csv 文件,其中来源、媒介和活动分别出现在它们自己的列中(加上日志文件中的其他几个字段)。

我是这样开始的(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 but not from https://www.example.com/page.html?&utm_medium=display&utm_source=publisher&utm_campaign=standard&someotherparam 中提取数据。由于参数顺序不一致对我不起作用

我已经为由或 (|) 分隔的正则表达式尝试了多个条件,但只给了我第一个匹配项。我还尝试在它自己的提取命令中提取每个参数,然后加入数据,但这花了很长时间,最终导致数据重复。

那么重写我的 pig 命令的最佳(或至少是可行的)方法是什么,以便它可以独立于它们出现的顺序从 url 中提取所有三个 utm 参数?

我只需要三个 REGEX_ECTRACT:

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

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