【问题标题】:Apache Pig: Extracting url query parameters that appear in arbitrary orderApache Pig:提取以任意顺序出现的 url 查询参数
【发布时间】:2015-02-05 22:15:34
【问题描述】:

我有一个带有带有自定义 Google Analytics 活动参数(utm_source、utm_medium、utm_campaign)标记的 URL 的日志文件。我需要从 url 中提取参数并创建一个 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 提取数据,但不从https://www.example.com/page.html?&utm_medium=display&utm_source=publisher&utm_campaign=standard&someotherparam 提取数据。由于参数顺序不一致,这对我不起作用。

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

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

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    我只需要三个REGEX_ECTRACT

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

    虽然您可能只使用一个正则表达式就可以做到这一点,但我发现这更简单且更具可读性。

    【讨论】:

    • 我实际上已经尝试过了,并且出于某种原因确信它不起作用(但确实如此)。我试着记住我的问题是什么,如果我明天不记得我会接受:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多