Я использую Datafu Hyperloglog UDF для оценки количества уникальных идентификаторов в моем наборе данных. В этом случае у меня есть 320 миллионов уникальных идентификаторов, которые могут появляться в моем наборе данных несколько раз.
Dataset : Country, ID.
Вот мой код:
REGISTER datafu-1.2.0.jar;
DEFINE HyperLogLogPlusPlus datafu.pig.stats.HyperLogLogPlusPlus();
-- id is a UUID, for example : de305d54-75b4-431b-adb2-eb6b9e546014
all_ids =
LOAD '$data'
USING PigStorage(';') AS (country:chararray, id:chararray);
estimate_unique_ids =
FOREACH (GROUP all_ids BY country)
GENERATE
'Total Ids' as label,
HyperLogLogPlusPlus(all_ids) as reach;
STORE estimate_unique_ids INTO '$output' USING PigStorage();
Используя 120 редукторов, я заметил, что большинство из них завершаются в течение нескольких минут. Однако несколько редукторов были перегружены данными и работали вечно. Я убил их через 24 часа.
Я думал, что Hyperloglog более эффективен, чем реальный подсчет. Что здесь происходит не так?