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个参数:
例如:{(大),(富),(孤独)}
- 为了消除元组,只留下值,您可以稍微玩一下这个包。
在本系列中,您可以了解何时避免在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);