gpt4 book ai didi

hadoop - Pig Latin(在 foreach 循环中过滤第二个数据源)

转载 作者:可可西里 更新时间:2023-11-01 14:54:36 25 4
gpt4 key购买 nike

我有 2 个数据源。一个包含 API 调用列表,另一个包含所有相关的身份验证事件。每个 Api 调用可以有多个身份验证事件,我想找到以下身份验证事件:
a) 包含与 Api 调用相同的“标识符”
b) 在 Api 调用后一秒内发生
c) 经过上述过滤后最接近的Api Call。

我曾计划在 foreach 循环中遍历每个 ApiCall 事件,然后在 authevents 上使用过滤器语句来找到正确的事件 - 然而,这似乎不可能 (USING Filter in a Nested FOREACH in PIG)

谁能建议其他方法来实现这一目标。如果有帮助,这是我尝试使用的 Pig 脚本:

apiRequests = LOAD '/Documents/ApiRequests.txt' AS (api_fileName:chararray, api_requestTime:long, api_timeFromLog:chararray, api_call:chararray, api_leadString:chararray, api_xmlPayload:chararray, api_sourceIp:chararray, api_username:chararray, api_identifier:chararray);
authEvents = LOAD '/Documents/AuthEvents.txt' AS (auth_fileName:chararray, auth_requestTime:long, auth_timeFromLog:chararray, auth_call:chararray, auth_leadString:chararray, auth_xmlPayload:chararray, auth_sourceIp:chararray, auth_username:chararray, auth_identifier:chararray);
specificApiCall = FILTER apiRequests BY api_call == 'CSGetUser'; -- Get all events for this specific call
match = foreach specificApiCall { -- Now try to get the closest mathcing auth event
filtered1 = filter authEvents by auth_identifier == api_identifier; -- Only use auth events that have the same identifier (this will return several)
filtered2 = filter filtered1 by (auth_requestTime-api_requestTime)<1000; -- Further refine by usings auth events within a second on the api call's tiime
sorted = order filtered2 by auth_requestTime; -- Get the auth event that's closest to the api call
limited = limit sorted 1;
generate limited;
};
dump match;

最佳答案

嵌套 FOREACH 不适用于在遍历第一个关系时处理第二个关系。这是当你的亲戚有一个包在里面,你想和那个包一起工作时,就好像它是它自己的亲戚一样。您不能同时使用 apiRequestsauthEvents ,除非您首先进行某种连接或分组以将您需要的所有信息放入一个关系中。

如果您不需要将自己限制在单个授权事件中,您的任务在概念上可以很好地与 JOINFILTER 配合使用:

allPairs = JOIN specificApiCall BY api_identifier, authEvents BY auth_identifier;
match = FILTER allPairs BY (auth_requestTime-api_requestTime)<1000;

现在所有信息都在一起了,您可以执行 GROUP match BY api_identifier 后跟嵌套的 FOREACH 来挑选单个事件。

但是,如果您使用 COGROUP 运算符,您可以在一个步骤中完成此操作,这类似于 JOIN 但没有叉积 - 您会得到两个袋子来自每个关系的分组记录。使用它来挑选最近的授权事件:

cogrp = COGROUP specificApiCall BY api_identifier, authEvents BY auth_identifier;
singleAuth = FOREACH cogrp {
auth_sorted = ORDER authEvents BY auth_requestTime;
auth_1 = LIMIT auth_sorted 1;
GENERATE FLATTEN(specificApiCall), FLATTEN(auth_1);
};

然后 FILTER 只留下 1 秒内的那些:

match = FILTER singleAuth BY (auth_requestTime-api_requestTime)<1000;

关于hadoop - Pig Latin(在 foreach 循环中过滤第二个数据源),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17375328/

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