Apache pig pig过滤器与原始数据集的获取

Apache pig pig过滤器与原始数据集的获取,apache-pig,Apache Pig,我有一个pig输入文件,如下所示: 1, cornflakes, Regular, Post, 10 2, cornflakes, Regular,General Mills, 12 3, cornflakes, Mixed Nuts, Post, 14 4, chocolate syrup, Regular, Hersheys, 5 5, chocolate syrup, No High Fructose, Hersheys, 8 6, chocolate syrup, Regular, Gh

我有一个pig输入文件,如下所示:

1, cornflakes, Regular, Post, 10
2, cornflakes, Regular,General Mills, 12
3, cornflakes, Mixed Nuts, Post, 14
4, chocolate syrup, Regular, Hersheys, 5
5, chocolate syrup, No High Fructose, Hersheys, 8
6, chocolate syrup, Regular, Ghirardeli, 6
7, chocolate syrup, Strawberry Flavor, Ghirardeli, 7
我需要过滤掉小于12的玉米片,我需要使用原始数据集进行下一步过滤

total = LOAD 'location_of_file' using PigStorage('\t') as (item_sl : int, item : chararray, type: chararray, manufacturer: chararray, price : int);
filter1 = FILTER total BY item == 'cornflakes' AND price < 12;
total=使用PigStorage('\t')加载文件的“位置”(项目:int,项目:chararray,类型:chararray,制造商:chararray,价格:int);
filter1=按项目过滤的总数==‘玉米片’且价格<12;

现在,我需要在filter1之后使用原始数据集进行下一步的筛选。

运行该命令时

total = LOAD 'location_of_file' using PigStorage('\t') as (item_sl : int, item : chararray, type: chararray, manufacturer: chararray, price : int);
filter1 = FILTER total BY item == 'cornflakes' AND price < 12;
filter1 = FILTER total BY item == 'cornflakes' AND price < 12;
filter1=按项目过滤总计==“玉米片”和价格<12;
它不会改变原来的关系,total。相反,它创建了一个新的关系filter1。现在,你有两个关系要处理。您可以在程序中的任意点访问total。例如:

total = LOAD 'location_of_file' ...   -- total relation is created
filter1 = FILTER total BY item == 'cornflakes' AND price < 12; -- filter1 is created
...
filter2 = filter total by ... -- filter2 is created
...

/* Now count rows of original total (total is unchanged) */
grouped = group total by all;
total_row_count = foreach grouped generate COUNT(total) as cnt;
total=加载“文件的位置”…--已创建总关系
filter1=按项目过滤的总数==‘玉米片’和价格<12;--过滤器1已创建
...
filter2=按…-过滤总计过滤器2已创建
...
/*现在计算原始总计的行数(总计不变)*/
分组=所有人的分组总数;
total_row_count=每个分组的生成计数(total)作为cnt;
使用

total=LOAD'/output/systemhawk/file_inventory/test34.txt',使用PigStorage(',')作为(项目:int,项目:chararray,类型:chararray,制造商:chararray,价格:int);
如果(项目=‘玉米片’且价格<12),则将总额拆分为过滤器1,否则拆分为过滤器2;
卸载过滤器2;
为什么不使用


此后,您可以使用过滤集作为f1_总计,其余作为f2_总计。根据您的需要应用条件

total是您的原始数据集。为什么不能在下一步筛选时使用total?你的最终目标是什么?我需要在第一次筛选后将total存储为一个单独的文件,然后在itOk上应用下一个筛选,那么是什么阻止了你这么做?为什么必须将其存储到单独的文件中?数据集与正在加载的文件完全相同。只需创建一个名为filter2=filter total BY(条件2)的新筛选器;筛选并不意味着原始数据集将更改。total仍将保留从输入文件加载的整个数据集。@inquisitive_mind我知道筛选不会更改原始数据集,我试图实现的是从原始数据集中删除筛选数据并保留剩余数据。这就像使用sql进行删除并保留通过过滤器的数据一样,我确实了解它是如何工作的,但在我所有不同过滤器的末尾,我需要保留原始数据集,并从每个过滤器中删除数据。这就像从原始数据集中删除数据并使用过滤器实现数据。在这种情况下,您需要的是最后一个过滤器。如果没有获得正确的数据,请将其他项过滤到其他项?期望的输出是什么?使用=玉米片和价格>=12带来的数据仅为非玉米片且大于12的数据。但是我想要的输出是没有filter1过滤的记录的总数据集,这实际上就像使用条件执行sql删除,并在从filter1中删除记录而不是使用filter1后保留原始数据集(total),你只需要做与filter1相反的事情就可以得到total-filter1记录。这正是你想要的=玉米片和价格>=12。只包括不在使用==玉米片和价格<12的筛选器1中的记录。为什么不在问题中包括所需的输出?这是我所需的输出:
total = LOAD 'location_of_file' using PigStorage('\t') as (item_sl : int, item : chararray, type: chararray, manufacturer: chararray, price : int);
SPLIT total into F1_total IF (your considtion), f2_total if (your conditions);