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)
...
虽然你可能只用一个正则表达式就可以做到,但我发现它更简单,更易读。
我有一个包含 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)
...
虽然你可能只用一个正则表达式就可以做到,但我发现它更简单,更易读。