Apache pig 如何优化PIG拉丁语中的group by语句?

Apache pig 如何优化PIG拉丁语中的group by语句?,apache-pig,Apache Pig,我有一个扭曲的数据集,我需要做一个分组操作,然后在上面做一个嵌套的foreach。由于数据倾斜,很少有还原程序需要很长时间,而其他还原程序则不需要时间。我知道存在倾斜连接,但GROUPBY和foreach有什么区别?这是我的pig代码(重命名变量): 在您的示例中,FOREACH中有许多嵌套的不同运算符,它们在reducer中执行,它依赖于RAM来计算唯一值,而此查询只生成一个作业。如果一个组中的唯一元素太多,那么也可能会出现与内存相关的异常 幸运的是,PIG Latin是一种数据流语言,您可以

我有一个扭曲的数据集,我需要做一个分组操作,然后在上面做一个嵌套的foreach。由于数据倾斜,很少有还原程序需要很长时间,而其他还原程序则不需要时间。我知道存在倾斜连接,但GROUPBY和foreach有什么区别?这是我的pig代码(重命名变量):


在您的示例中,FOREACH中有许多嵌套的不同运算符,它们在reducer中执行,它依赖于RAM来计算唯一值,而此查询只生成一个作业。如果一个组中的唯一元素太多,那么也可能会出现与内存相关的异常

幸运的是,PIG Latin是一种数据流语言,您可以编写某种执行计划。为了利用更多的CPU,您可以以强制执行更多可并行执行的MapReduce作业的方式更改代码。为此,我们应该在不使用嵌套的DISTINCT的情况下重写查询,诀窍是执行DISTINCT操作,然后分组,就像只有一列一样,然后合并结果。它非常像SQL,但它可以工作。这是:

records = LOAD '....' USING PigStorage(',') AS (g, a, b, c, d, fd, s, w);
selected = FOREACH records GENERATE g, a, b, c, d;
grouped_a = FOREACH selected GENERATE g, a;
grouped_a = DISTINCT grouped_a;
grouped_a_count = GROUP grouped_a BY g;
grouped_a_count = FOREACH grouped_a_count GENERATE FLATTEN(group) as g, COUNT(grouped_a) as a_count;

grouped_b = FOREACH selected GENERATE g, b;
grouped_b = DISTINCT grouped_b;
grouped_b_count = GROUP grouped_b BY g;
grouped_b_count = FOREACH grouped_b_count GENERATE FLATTEN(group) as g, COUNT(grouped_b) as b_count;

grouped_c = FOREACH selected GENERATE g, c;
grouped_c = DISTINCT grouped_c;
grouped_c_count = GROUP grouped_c BY g;
grouped_c_count = FOREACH grouped_c_count GENERATE FLATTEN(group) as g, COUNT(grouped_c) as c_count;

grouped_d = FOREACH selected GENERATE g, d;
grouped_d = DISTINCT grouped_d;
grouped_d_count = GROUP grouped_d BY g;
grouped_d_count = FOREACH grouped_d_count GENERATE FLATTEN(group) as g, COUNT(grouped_d) as d_count;

mrg = JOIN grouped_a_count BY g, grouped_b_count BY g, grouped_c_count BY g, grouped_d_count BY g;
out = FOREACH mrg GENERATE grouped_a_count::g, grouped_a_count::a_count, grouped_b_count::b_count, grouped_c_count::c_count, grouped_d_count::d_count;
STORE out into '....' USING PigStorage(',');
执行后,我得到了以下总结,这表明不同的操作不会受到第一个作业处理的数据中的倾斜的影响:

Job Stats (time in seconds):
      JobId            Maps    Reduces MaxMapTime      MinMapTIme      AvgMapTime      MaxReduceTime   MinReduceTime   AvgReduceTime   Alias   Feature Outputs
job_201206061712_0244   669     45      75      8       13      376     18      202     grouped_a,grouped_b,grouped_c,grouped_d,records,selected        DISTINCT,MULTI_QUERY
job_201206061712_0245   1       1       3       3       3       12      12      12      grouped_c_count GROUP_BY,COMBINER
job_201206061712_0246   1       1       3       3       3       12      12      12      grouped_b_count GROUP_BY,COMBINER
job_201206061712_0247   5       1       48      27      33      30      30      30      grouped_a_count GROUP_BY,COMBINER
job_201206061712_0248   1       1       3       3       3       12      12      12      grouped_d_count GROUP_BY,COMBINER
job_201206061712_0249   4       1       3       3       3       12      12      12      mrg,out HASH_JOIN       ...,
Input(s):
Successfully read 52215768 records (44863559501 bytes) from: "...."

Output(s):
Successfully stored 9 records (181 bytes) in: "..."
从作业DAG中,我们可以看到groupby操作是并行执行的:

Job DAG:
job_201206061712_0244   ->      job_201206061712_0248,job_201206061712_0246,job_201206061712_0247,job_201206061712_0245,
job_201206061712_0248   ->      job_201206061712_0249,
job_201206061712_0246   ->      job_201206061712_0249,
job_201206061712_0247   ->      job_201206061712_0249,
job_201206061712_0245   ->      job_201206061712_0249,
job_201206061712_0249

它在我的数据集上运行良好,其中一个组键值(在g列中)生成了95%的数据。它还消除了与内存相关的异常

我最近在加入时遇到了一个错误。。如果组中存在任何空值,则整个关系将被删除

多好的回答!!您现在在nosql中从事哪些项目?
Job DAG:
job_201206061712_0244   ->      job_201206061712_0248,job_201206061712_0246,job_201206061712_0247,job_201206061712_0245,
job_201206061712_0248   ->      job_201206061712_0249,
job_201206061712_0246   ->      job_201206061712_0249,
job_201206061712_0247   ->      job_201206061712_0249,
job_201206061712_0245   ->      job_201206061712_0249,
job_201206061712_0249