- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个倾斜的数据集,我需要按操作进行分组,然后对其进行嵌套的 foreach。由于数据倾斜,很少有 reducer 需要很长时间,而其他 reducer 则不需要时间。我知道存在倾斜连接,但是 group by 和 foreach 有什么?这是我的 pig 代码(重命名变量):
foo_grouped = GROUP foo_grouped by FOO;
FOO_stats = FOREACH foo_grouped
{
a_FOO_total = foo_grouped.ATTR;
a_FOO_total = DISTINCT a_FOO_total;
bar_count = foo_grouped.BAR;
bar_count = DISTINCT bar_count;
a_FOO_type1 = FILTER foo_grouped by COND1=='Y';
a_FOO_type1 = a_FOO_type1.ATTR;
a_FOO_type1 = DISTINCT a_FOO_type1;
a_FOO_type2 = FILTER foo_grouped by COND2=='Y' OR COND3=='HIGH';
a_FOO_type2 = a_FOO_type2.ATTR;
a_FOO_type2 = DISTINCT a_FOO_type2;
generate group as FOO,
COUNT(a_FOO_total) as a_FOO_total, COUNT(a_FOO_type1) as a_FOO_type1, COUNT(a_FOO_type2) as a_FOO_type2, COUNT(bar_count) as bar_count; }
最佳答案
在您的示例中,FOREACH 中有很多嵌套的 DISTINCT 运算符,它们在 reducer 中执行,它依赖于 RAM 来计算唯一值,并且此查询仅生成一个作业。如果组中的唯一元素太多,您也可能会遇到与内存相关的异常。
幸运的是,PIG Latin 是一种数据流语言,您可以编写某种执行计划。为了利用更多的 CPU,您可以更改代码以强制执行更多可以并行执行的 MapReduce 作业。为此,我们应该在不使用嵌套 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: "..."
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
关于apache-pig - 如何在 PIG 拉丁语中优化 group by 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10732456/
我想在嵌入式 pig 程序中执行一个 pig 脚本文件,如下所示 ----testPig.pig----- A = load '/user/biadmin/student' using PigStor
我正在使用 CurrentTime(),它是一种日期时间数据类型。但是,我需要它作为字符数组。我有以下几点: A = LOAD ... B = FOREACH A GENERATE CurrentTi
我有一个 hadoop 集群。 安装了 pig : 但是在 Hue (3.7) 中看不到 Pig 编辑器: 我该如何解决? 最佳答案 你能检查一下你的hue.ini文件吗 在解释器部分,如下图 # O
我在源文本文件中有一些日期值,如下面的第 3 列 123|text|2000-02-05 01:00:00-0500|true 如何将它们转换为 Pig 拉丁语中相应的 long 值?谢谢。 a =
看来我做不到 dump (limit A 10); 尽管 B = limit A 10; dump B; 似乎工作。 为什么?这似乎违反直觉。 最佳答案 确实是你不能这样做。 我相信为什么的问题不在范
A = load 'a.txt' as (id, a1); B = load 'b.txt as (id, b1); C = join A by id, B by id; D = foreach C
假设我有一个输入文件作为 map 。 sample.txt [1#"anything",2#"something",3#"anotherthing"] [2#"kish"] [3#"mad"] [4#
我正在尝试用 PIG 减去两个日期。 我有这样的数据: key_one, activation_date , deactivation_date (1456,2010-06-14 00:00:00,2
我正在与 pig 一起加载以逗号分隔的文件/文件夹 hadoop 范围。( this question on how to load multiple files in pig 问题是每个文件夹都有不
我一直认为 '' 和 "" 在 pig 中是一样的,但今天我得到了 Unexpected character '"' 出错 register datafu-pig-1.2.1.jar define C
我有一个运行 Hadoop 0.20.2 和 Pig 0.10 的集群。我有兴趣向 Pig 的源代码添加一些日志,并在集群上运行我自己的 Pig 版本。 我做了什么: 使用'ant'命令构建项目 得到
我无能为力地试图解决这个问题。我的脚本和 UDF 可以在 Pig 0.8.1 上完美运行,但是当我尝试在 Pig 0.10.0 上运行时,我得到: ERROR org.apache.pig.tools
目前我正在执行我的脚本: /usr/bin/pig /somepath/myscript.pig 出于某种原因,pig 总是卡在这个阶段。 2014-01-28 16:49:31,328 [main]
我有一个要加载到 Pig Engine 上的文本文件, 文本文件在单独的行中有名称,数据但有错误......特殊字符......像这样: Ja@@$s000on J@@a%^ke T!!ina M
我有一个用例,我需要计算两个字段的不同数量。 sample : x = LOAD 'testdata' using PigStorage('^A') as (a,b,c,d); y = GROUP x
我是 Pig 的新手,在解析我的输入并将其转换为我可以使用的格式时遇到了问题。输入文件包含具有固定字段和 KV 对的行,如下所示: FF1|FF2|FF3|FF4|KVP1|KVP2|...|KVPn
我有一个每天创建的文件文件夹,所有文件都存储相同类型的信息。我想制作一个脚本,加载最新的 10 个,将它们联合起来,然后在它们上运行一些其他代码。由于 pig 已经有一个 ls 方法,我想知道是否有一
我正在使用 Pig 0.11.0 排名函数并为我的数据中的每个 id 生成排名。 我需要以特定方式对我的数据进行排名。我希望每个新 ID 的排名都重置并从 1 开始。 是否可以直接使用 rank 函数
我有一个 (t,a,b) 形式的元组集合,我想在 Pig 中按 b 对它们进行分组。一旦分组,我想从每组中的元组中过滤出 b 并为每组生成一袋过滤后的元组。 例如,假设我们有 (1,2,1) (2,0
-- do something store result into '$RESULT.tmp'; rmf $RESULT mv $RESULT.tmp $RESULT 如果在 rmf $RESULT
我是一名优秀的程序员,十分优秀!