【发布时间】:2014-02-05 21:47:20
【问题描述】:
在使用 Pig 的 Hadoop 中,我在几个单独的源中有大量字段,我加载、过滤、项目、组、通过几个 Java UDF 运行、加入、项目和存储。 (这就是 Hadoop 中的日常生活。)UDF 不使用原始数据加载中的某些字段,并且在最终存储之前不需要。
什么时候通过 UDF 传递未使用的字段比稍后存储和加入它们更好?
一个简单的玩具示例是包含name,weight,height 列的数据源,我最终想存储name,weight,heightSquared。我的 UDF 将为我调整高度。哪个更好:
inputdata = LOAD 'data' AS name,weight,height;
outputdata = FOREACH inputdata
GENERATE myudf.squareHeight(name,weight,height)
AS (name,weight,heightSquared);
STORE outputdata INTO 'output';
或
inputdata = LOAD 'data' AS name,weight,height;
name_weight = FOREACH inputdata
GENERATE name,weight;
intdata1 = FOREACH inputdata
GENERATE myudf.squareHeight(name,height)
AS (iname,heightSquared);
intdata2 = JOIN intdata1 BY iname, name_weight BY name;
outputdata = FOREACH intdata2
GENERATE name,weight,heightSquared;
STORE outputdata INTO 'output';
在这种情况下,它看起来很明显:第一种情况更好。但是UDF 确实必须读取、存储和输出weight 字段。当您有 15 个字段时,UDF 不关心并且有一个字段,第一种情况是否更好?
【问题讨论】:
标签: hadoop apache-pig hadoop-streaming