java—在mapreduce作业中通过reducer中的文本输入值进行多次迭代

g0czyy6m  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(405)

我在hdfs上有两个非常大的数据集(表)。我想在某些列上加入它们,然后在某些列上对它们进行分组,然后在某些列上执行一些分组函数。
我的步骤是:
1-创造两个就业机会。
2-在第一个作业中,in mapper读取每个数据集的行作为Map输入值,并发出join列的值作为Map输出键,其余列的值作为Map输出值。
Map完成后,mapreduce框架执行洗牌,并根据Map输出键对所有Map输出值进行分组。
然后,在reducer中,它读取每个map输出键及其值,其中man包含两个数据集中的许多行。
我想要的是多次迭代reduce输入值,以便执行笛卡尔积。
举例说明:
假设对于连接键x,一个数据集中有100个匹配项,另一个数据集中有200个匹配项。这意味着在连接键x上连接它们会产生100*200=20000的组合。我想发出nullwritable作为reduce输出键,每个笛卡尔积作为reduce输出值。
示例输出可能是:
对于联接键x:
from(nullwritable),(第一(1),第二(1))
over(nullwritable),(第一(1),第二(200))
至(可空写),(第一(100),第二(200))
我该怎么做?
我只能迭代一次。我无法兑现这些价值观,因为它们不符合记忆。
3-如果这样做,我将启动第二个作业,它将第一个作业的结果文件作为输入文件。在mapper中,我将组列的值作为Map输出键,其余列的值作为Map输出值。然后在reducer中,通过遍历每个键的值,我对sum、avg、max、min等列执行一些函数。
提前多谢了。

s1ag04yj

s1ag04yj1#

由于您的第一个mr作业使用join键作为map输出键,因此您的第一个reducer将为每个reduce调用获得(k join_键,list值)。您所能做的只是将值分隔成两个单独的列表,每个列表对应一个数据源,并使用嵌套for循环进行笛卡尔积。

相关问题