0

過去の参照のために分析しようとしている TB の HTTP アクセス ログがあります。UNIQUE 訪問者 (IP) の毎日の数とヒットの毎日の数を取得しようとしています。

これが MySQL にある場合は、次のようにします。

SELECT COUNT(1) from access_logs union
SELECT COUNT(DISTINCT(ip)) from access_logs

1 つのジョブで似たようなことを行う方法はありますか?

これが機能しないことはわかっていますが、これは私が探している機能の一種です。

X = (fqdn:chararray,ip:chararray,date:chararray,time:chararray,uri:chararray,ua:chararray);
Y = COUNT(X);
Z = COUNT(DISTINCT(X.IP);
OUT = UNION Y,Z;
STORE OUT into ...
4

1 に答える 1

0

入力内のすべてのレコードをカウントする場合は、1 つのバッグを作成する GROUP ALL を使用する必要があります。また、パフォーマンス上の理由から、アキュムレータ DISTINCT 関数 org.apache.pig.builtin.Distinct を使用します

X = load 'path' as (fqdn:chararray,ip:chararray,date:chararray,time:chararray,uri:chararray,ua:chararray);
IPs = FOREACH X GENERATE ip; // project early for performance reasons
GRP = group IPs all;
OUT = foreach GRP generate COUNT(IPs) as all_cnt, COUNT(org.apache.pig.builtin.Distinct(IPs.ip)) as distinct_cnt;

IP が多すぎてメモリ関連の例外が発生する場合は、次のようにできます。

X = load 'path' as (fqdn:chararray,ip:chararray,date:chararray,time:chararray,uri:chararray,ua:chararray);
IPs = FOREACH X GENERATE ip; // project early for performance reasons
Dist_IPs = distinct IPs;
GRP_DIST = group Dist_IPs all;
DIST = foreach GRP_DIST generate COUNT(GRP_DIST) as cnt, 'dist' as category;

GRP_ALL = group IPs all;
ALL = foreach GRP_ALL generate COUNT(GRP_ALL)as cnt, 'all' as category;

OUT = union DIST, ALL;
于 2013-10-04T08:46:21.177 に答える