IN оператор в Apache Pig

#apache-pig

#apache-pig

Вопрос:

Существует ли эквивалент оператора IN для Apache Pig? В настоящее время я использую Apache Pig 0.10.0

Я хочу сделать что-то похожее на это:

 select count(distinct(o.order_id)),count(od.prod_id),count(od.prod_id)/count(distinct(o.order_id)) 
    from orders o 
    inner join order_details od 
    on od.order_id=o.order_id 
    where o.order_id 
    in (
        select * 
        from (select o.order_id 
                from orders o 
                inner join order_details od 
                on od.order_id = o.order_id 
                where(o.order_date between '2013-05-01' and '2013-05-31') and (od.prod_id=1274348)
        ) as subq
    );
  

Ответ №1:

Вероятно, это эквивалентный скрипт в Pig. Вы можете создать столько промежуточных отношений, сколько захотите, чтобы получить только те данные, которые вам нужны, прежде чем генерировать подсчеты. Обратите внимание, что я обрабатывал даты как временные метки; вы могли бы использовать встроенный ToDate UDF, который может преобразовывать временные метки UNIX или даты в виде символов в собственные типы Pig DateTime.

 -- Load in all of your data
-- Replace with actual paths
-- You may need to supply a delimiter value

o = LOAD 'orders' USING PigStorage() AS (
    order_date:long,
    order_id:chararray
);

od = LOAD 'order_details' USING PigStorage() AS (
    order_id:chararray,
    prod_id:chararray
);

-- Filter like WHERE in SQL
-- Replace 1000 and 2000 with actual timestamps

o_filtered = FILTER o BY order_date <= 2000 AND order_date >= 1000;

od_filtered = FILTER od BY prod_id == '1274348';

-- Inner join - only needed once in Pig

subq = JOIN o_filtered BY order_id, od_filtered BY order_id;

-- Drop fields not needed for final counts

subq_renamed = FOREACH subq GENERATE
    o_filtered::order_id AS order_id,
    od_filtered::prod_id AS prod_id;

-- To do the counts, need to group the data

subq_counts = FOREACH (GROUP subq_renamed ALL) {
    dist_order_id = DISTINCT subq_renamed.order_id;
    GENERATE
    COUNT(dist_order_id) AS dist_order_id_count,
    COUNT(subq_renamed.prod_id) AS prod_id_count;
}

-- Calculate the ratio count(od.prod_id)/count(distinct(o.order_id))

final_counts = FOREACH subq_counts GENERATE *,
    (float)prod_id_count/dist_order_id_count AS prod_order_ratio;