Apache pig 在Pig中将行添加到表中

Apache pig 在Pig中将行添加到表中,apache-pig,Apache Pig,我找不到解决猪这个看似简单的问题的办法 我有一张桌子,看起来像: (USA, "big",somevalue1) (USA, "rich",somevalue2) (RU, "big",somevalue3) (BR, "rich",somevalue4) (BR, "rich",somevalue5) 作为我想要的输出 (USA, "big",somevalue1) (USA, "rich",somevalue2) (RU, "big",somevalue3) (RU, "rich",0)

我找不到解决猪这个看似简单的问题的办法

我有一张桌子,看起来像:

(USA, "big",somevalue1)
(USA, "rich",somevalue2)
(RU, "big",somevalue3)
(BR, "rich",somevalue4)
(BR, "rich",somevalue5)
作为我想要的输出

(USA, "big",somevalue1)
(USA, "rich",somevalue2)
(RU, "big",somevalue3)
(RU, "rich",0)
(BR, "rich",somevalue4)
(BR, "rich",somevalue5)
(BR, "big",0)
i、 e添加行,以便每个国家共享关于第二列的相同“信息”,即使这意味着填写零个未知值

编辑

这是我想出的解决办法

USA "big"   1
USA "rich"  2
RU  "big"   3
BR  "rich"  4
BR  "rich"  5
(输入example.txt)

正如预期的那样:

(USA,"rich",2)
(USA,"big",1)
(RU,"rich",0)
(RU,"big",3)
(BR,"rich",4)
(BR,"rich",5)
(BR,"big",0)

我相信最简单的方法是按第一个字段分组,然后foreach group,将相关的包发送到您自己的UDF中,UDF将遍历包中的元组,并在需要时返回一个包含现有元组+默认元组的新包

为了为第二个字段(“实用程序包”)创建所需值的列表,您可以使用distinct和group by ALL.

以下是脚本的外观:

input_data = LOAD 'input.csv' USING PigStorage('\t') 
               AS (country:chararray, f2:chararray, somevalue:chararray);

only_second_field = FOREACH input_data GENERATE f2;
distinct_list = DISTINCT only_second_field;
utility_bag = GROUP distinct_list ALL;

grouped = FOREACH (GROUP input_data BY country) 
     GENERATE group, CustomUDF(input_data, utility_bag.distinct_list) AS enhancedBag;

result = FOREACH grouped GENERATE flatten(enhancedBag);
您的自定义自定义自定义项应获得2个参数:

  • 带有原始模式的包:{(国家:chararray,f2:chararray,somevalue:chararray)}
  • 带有模式的包:{(f2:chararray)}
    例如:{(大),(富),(孤独)}
    • 为了消除元组,只留下值,您可以稍微玩一下这个包。
  • 关于您提出的解决方案,它是好的,但由于使用了交叉和连接操作(这会导致额外的MapReduce作业),因此效率不是很高

    在本系列中,您可以了解何时避免在Pig中使用交叉:


    希望能有所帮助。

    我事先不知道默认的元组。在我的例子中,我不知道集合{“big”,“rich”}必须为每个国家出现。这一套可能更大,比如{“大”、“富”、“油”}。我需要首先分离“最大”集合…我不知道这是一个无限值列表,而不仅仅是“大”和“富”。所以我编辑了我的答案,为你的问题提供了详细的解决方案。希望它能起作用。
    input_data = LOAD 'input.csv' USING PigStorage('\t') 
                   AS (country:chararray, f2:chararray, somevalue:chararray);
    
    only_second_field = FOREACH input_data GENERATE f2;
    distinct_list = DISTINCT only_second_field;
    utility_bag = GROUP distinct_list ALL;
    
    grouped = FOREACH (GROUP input_data BY country) 
         GENERATE group, CustomUDF(input_data, utility_bag.distinct_list) AS enhancedBag;
    
    result = FOREACH grouped GENERATE flatten(enhancedBag);